git stash之后,未更改的文件显示在非分页列表中

时间:2014-08-07 20:54:01

标签: git git-stash

我有一个我想要藏匿的变化的回购......所以我做了。在存储之后,许多文件显示为已更改,即使唯一的“更改”是所有行显示为已删除然后重新添加。我没有做出这些改变。为了澄清,这些文件在存储之前没有显示,因为没有对它们进行任何更改。这是最有趣的部分,经过几个小时的实验,我发现我可以复制整个目录,执行'git checkout - 。'然后是'git status',然后错误显示的文件消失了。如果我尝试'git checkout - 。'在原始回购中,'git status'显示它们仍在那里,我所做的一切都不会消除它们。另外需要注意的是,即使在复制回购之后,如果我在“git checkout - 。”之前首先进入'git status',它仍然会错误地显示文件被更改,实际上它们没有已经改变了。

还有一点需要注意,我已经阅读了许多关于行结尾等的帖子。这不是这里发生的事情。各种文件都是相同的。

1 个答案:

答案 0 :(得分:1)

  

还有一点需要注意,我已经阅读了很多关于行尾等的帖子。这不是这里发生的事情。各种文件都是相同的。

有一种情况,文件可以相同,直到最后一个字节,但仍然是"不同"根据{{​​1}}。是的,它通常会归结为行结尾。

我最好的猜测是,你在Windows机器上,并且在git status文件的某个地方,你有一个指令,告诉git执行行结束规范化(通过.gitattributes或类似的东西)。如果确实如此,那么当您签出文件时,其LF将转换为CRLF,并且当您提交文件时,其CRLF将转换为LF。

如果是这样,最有可能发生的事情是,相关文件的存储库版本在某种程度上具有CRLF。当你检查出来时,工作副本当然也会有那些CRLF。现在,这里有一个问题:当做* text=autogit status等时,git将repo / index中的内容与工作目录中的实际内容进行比较,而不是 将在行结束规范化完成后提交,即将CRLF替换为LF。在这种情况下,git看到index / repo中的内容有CRLF,而 提交的内容只有LF,因此存在差异。

要查看是否是这种情况,请运行以下命令:

git diff

第一个命令将显示提交的哈希值。第二个命令显示工作目录中实际内容的哈希值。第三个命令显示索引中的内容的哈希值。如果第一和第二个哈希值不同,而第二个和第三个哈希值相同,那么你几乎肯定处于我所描述的情况。

所以问题是,如何摆脱它?一种简单的方法是简单地添加/提交"更改"。这将具有将LF放入存储库副本中的效果,从而解决了前面的问题。但是,如果每个使用存储库的人都在Windows上,那么无论如何都不需要行规范化。您可以通过将git hash-object path/to/your/file git hash-object --no-filter path/to/your/file git ls-files -s path/to/your/file 放入* -text文件中来删除它们(并删除它下面用于将文件类型设置为文本的任何行)。当我遇到这个问题时,这是我选择的选项,因为我不是我的版本控制系统的粉丝,更改了我的文件内容。