Git奇怪的行为:神秘的变化无法撤消

我看到Git中的一个行为,对我来说似乎很神秘。 我保留从Github的Linux库的克隆本​​地玩Git。 清楚的是,我并没有在这个仓库中做很多事情:我获取更改,更新master ,检出特定的版本,有时我尝试使用Git GUI来查看大项目中的可视化效果。 TLDR版本: 我从来没有对其中的文件做任何改变

奇怪的行为

今天早些时候,我检查了master并从Github上取消了更改。 一切似乎都很好。 但我怀疑它实际上没有。 这就是现在的git status

 axel@macbook ~/Depots/linux $ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: include/linux/netfilter/xt_connmark.h # modified: include/linux/netfilter/xt_dscp.h # modified: include/linux/netfilter/xt_mark.h # modified: include/linux/netfilter/xt_rateest.h # modified: include/linux/netfilter/xt_tcpmss.h # modified: include/linux/netfilter_ipv4/ipt_ecn.h # modified: include/linux/netfilter_ipv4/ipt_ttl.h # modified: include/linux/netfilter_ipv6/ip6t_hl.h # modified: net/ipv4/netfilter/ipt_ecn.c # modified: net/netfilter/xt_dscp.c # modified: net/netfilter/xt_hl.c # modified: net/netfilter/xt_rateest.c # modified: net/netfilter/xt_tcpmss.c # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # samples/hidraw/ no changes added to commit (use "git add" and/or "git commit -a") 

我想知道这些变化是从哪里来的。 现在是最糟糕的部分。 让我们看看如果我试图摆脱这些文件,并再次检查出来会发生什么。

 axel@macbook ~/Depots/linux $ rm -Rf include net axel@macbook ~/Depots/linux $ git checkout -- . axel@macbook ~/Depots/linux $ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: include/linux/netfilter/xt_CONNMARK.h # modified: include/linux/netfilter/xt_DSCP.h # modified: include/linux/netfilter/xt_MARK.h # modified: include/linux/netfilter/xt_RATEEST.h # modified: include/linux/netfilter/xt_TCPMSS.h # modified: include/linux/netfilter_ipv4/ipt_ECN.h # modified: include/linux/netfilter_ipv4/ipt_TTL.h # modified: include/linux/netfilter_ipv6/ip6t_HL.h # modified: net/ipv4/netfilter/ipt_ECN.c # modified: net/netfilter/xt_DSCP.c # modified: net/netfilter/xt_HL.c # modified: net/netfilter/xt_RATEEST.c # modified: net/netfilter/xt_TCPMSS.c # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # samples/hidraw/ no changes added to commit (use "git add" and/or "git commit -a") 

那么,同样的事情。 git checkout操作似乎产生具有神秘变化的文件。 我试图进一步调查, 我想我消除了这些变化是由结束问题引起的可能性 。 看到下面的git diff的开始

 diff --git a/include/linux/netfilter/xt_CONNMARK.hb/include/linux/netfilter/xt_CONNMARK.h index 2f2e48e..efc17a8 100644 --- a/include/linux/netfilter/xt_CONNMARK.h +++ b/include/linux/netfilter/xt_CONNMARK.h @@ -1,6 +1,31 @@ -#ifndef _XT_CONNMARK_H_target -#define _XT_CONNMARK_H_target +#ifndef _XT_CONNMARK_H +#define _XT_CONNMARK_H -#include <linux/netfilter/xt_connmark.h> +#include <linux/types.h> -#endif /*_XT_CONNMARK_H_target*/ +/* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com> + * by Henrik Nordstrom <hno@marasystems.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ 

如果我理解了这个权利,那么这个改变就是改变一些行结尾所不能做的事情,对吗? 我做的最后一件事是:试图找出变化的鼻祖,但显然这是行不通的。 看到下面的git blame输出。

 axel@macbook ~/Depots/linux $ git blame include/linux/netfilter/xt_CONNMARK.h 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 1) #ifndef _XT_CONNMARK_H 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 2) #define _XT_CONNMARK_H 2e4e6a17 (Harald Welte 2006-01-12 13:30:04 -0800 3) 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 4) #include <linux/types.h> 0dc8c760 (Jan Engelhardt 2008-01-14 23:38:34 -0800 5) 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 6) /* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com> 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 7) * by Henrik Nordstrom <hno@marasystems.com> 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 8) * 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 9) * This program is free software; you can redistribute it and/or modify 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 10) * it under the terms of the GNU General Public License as published by 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 11) * the Free Software Foundation; either version 2 of the License, or 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 12) * (at your option) any later version. 00000000 (Not Committed Yet 2011-10-25 20:00:56 +0200 13) */ 

问题

我错过了什么? 我什么时候可能出错了,如何解决这个问题? 感谢您的提示和评论!

Solutions Collecting From Web of "Git奇怪的行为:神秘的变化无法撤消"

Linux源代码树的文件名仅在不同情况下有所不同,这会导致系统上出现感兴趣的故障,并且不区分大小写的文件系统。

您需要一个区分大小写的文件系统才能使用Linux源代码。

include/linux/netfilter/xt_connmark.hinclude/linux/netfilter/xt_CONNMARK.h是Git仓库中的两个不同的文件,但是如果你的文件系统是不区分大小写的,那么一次只能在你的checkout中存在一个。

尝试更新子模块。 当版本库中包含的子模块更新时,我收到了一些奇怪的,有点类似的问题。 做git submodule update可能会有所斩获。

正如@ephemient所说,这是因为不区分大小写的文件系统。 我猜你正在使用Mac的HFS?

对于Mac上的简单解决方案,您可以创建一个磁盘映像,使用“区分大小写的日志HFS +”格式化磁盘映像:

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/git.dmg

然后通过open ~/git.dmg挂载磁盘映像。

然后在可安装卷中执行所有git clonegit checkout操作。


或者您需要一些第三方工具将HFS +从不区分大小写转换为区分大小写。 据我所知,一些Mac应用程序是在不区分大小写的文件系统上制作的,所以如果你做这个转换,其中一些可能会失败。