未更改的文件在git隐藏后显示在未老化列表中

未更改的文件在git隐藏后显示在未老化列表中,git,git-stash,Git,Git Stash,我有一份回购协议,里面有我想隐藏的变动……所以我就这么做了。隐藏后,许多文件显示为已更改,即使唯一的“更改”是所有行显示为已删除,然后重新添加。我没有做这些改变。为了澄清,这些文件在藏匿之前没有出现,因为没有对它们进行任何更改。这里是最有趣的部分,经过几个小时的实验,我发现我可以复制整个目录,执行“git checkout-”,然后执行“git status”,然后错误显示的文件就消失了。如果我在原始回购协议上尝试“git checkout--”,则“git status”显示它们仍然存在,我所

我有一份回购协议,里面有我想隐藏的变动……所以我就这么做了。隐藏后,许多文件显示为已更改,即使唯一的“更改”是所有行显示为已删除,然后重新添加。我没有做这些改变。为了澄清,这些文件在藏匿之前没有出现,因为没有对它们进行任何更改。这里是最有趣的部分,经过几个小时的实验,我发现我可以复制整个目录,执行“git checkout-”,然后执行“git status”,然后错误显示的文件就消失了。如果我在原始回购协议上尝试“git checkout--”,则“git status”显示它们仍然存在,我所做的任何事情都无法摆脱它们。另一件需要注意的事情是,即使在复制回购协议之后,如果我在“git签出--”之前先进入“git状态”,它仍然会错误地将文件显示为正在更改,而实际上这些文件并未更改

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

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

在这种情况下,文件可以完全相同,直到最后一个字节,但根据
git状态仍然是“不同的”
。是的,它通常会归结为行尾

我对正在发生的事情的最佳猜测是,您在Windows计算机上,并且在
.gittributes
文件的某个地方,您有一个指令,告诉git执行行尾规范化(通过
*text=auto
或类似的方式)。如果确实如此,那么当您签出一个文件时,它的LFs将转换为CRLFs,当您提交一个文件时,它的CRLFs将转换为LFs

如果是这样的话,最有可能发生的情况是,所讨论文件的存储库版本中不知何故包含CRLF。当你检查它们时,工作副本当然也会有那些CRLF。现在问题来了:当执行
git状态
时,
git diff
等。git将repo/索引中的内容与工作目录中的实际内容进行比较,而不是与行结束规范化完成后提交的内容进行比较,即用LFs替换CRLFs。在本例中,git看到索引/回购中的内容有CRLFs,而您要提交的内容只有LFs,因此存在差异

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

git hash-object path/to/your/file
git hash-object --no-filter path/to/your/file
git ls-files -s path/to/your/file
第一个命令将向您显示将提交的内容的散列。第二个命令显示实际在工作目录中的内容的散列。第三个命令显示索引中内容的散列。如果第一个和第二个散列是不同的,第二个和第三个散列是相同的,那么您几乎肯定处于我描述的情况


所以问题是,如何摆脱它?一种简单的方法是简单地添加/提交“更改”。这将产生将LFs放入存储库副本的效果,从而解决未来的问题。但是,如果使用存储库的每个人都在Windows上,那么实际上根本不需要行规范化。您可以通过将
*-text
放入
.gittributes
文件中(并删除其下方将文件类型设置为text的任何行)来禁用它们。这是我遇到此问题时选择的选项,因为我不喜欢版本控制系统更改文件内容。

这可能导致行字符之间的更改。默认情况下,Git将使用linux方法存储文件,因此当windows获取该文件时,它会将其修改为自己的文件,Git会将其作为一种更改。您需要阅读一些关于如何将git与您的操作系统对齐以解决此问题的书籍。不幸的是,我现在不知道;对于如何解决这个问题,我有一个具体的答案。我刚刚注意到你的一句话,说它不是行尾,我想请你双倍确认这是真的,当我遇到这个问题时,我也这么想,但我错了。感谢Phaeze的回答……不幸的是,我已经仔细检查了这一点,这不是问题-\我会尝试的一件事是分期提交这些所谓的更改,看看它们是否返回。这会将它们删除,直到下一个
git stash
或切换分支导致它们返回,但我不想通过提交来引入错误的历史记录,只是为了解决这个问题。谢谢你的回答!我的
.gittributes
文件中确实有
*text=auto
,但我的印象是,这是我在windows框中安装git时选择的“按原样”结尾。这是我想要的行为…保持结尾“原样”,而不是改变它们。下次发生这种情况时,我将运行您发布的命令,看看它是否暴露了问题。