幻影本地变化显示在Git中

时间:2014-04-01 10:30:34

标签: windows git working-directory

我有一个非常奇怪的git错误,让我完全不知所措。它并不是一个主要的阻碍者,但它总是在工作中非常恼火。

我有一个存储库的工作副本,并且在所述工作副本中,每次我从一个分支切换到另一个分支时,Git告诉我,在切换完成后,我有本地修改。更多细节:

  1. 这是在Windows上
  2. Git状态显示文件已更改(每行更改,请参见附件截图中的示例)
  3. 超越比较显示没有差异;文件编码和行结尾是相同的,两个文件都完全相同的字节数。
  4. 奇怪的是:无论它们是什么,我都无法重置这些变化。即使删除文件然后重置删除也会导致新文件被更改。
  5. 这可能会发生什么?我认为它可能与文件属性有关,但我不知道如何检查它。

    Screenshot of phantom git changes


    更新: VonC是正确的,这是问题的线路结束。更具体地说,如果您将core.autocrlf设置为true,但是存储库中以前使用Windows行结尾提交的任何文件,那么您将看到此问题。无法重置更改的原因是签出文件会修改它,因为Git确定您的文件的工作副本与您的文件的工作副本不同我现在要承诺。令我感到困惑,我知道。

    无论如何,我能够通过一个巨大的提交来解决这个问题,这个提交将存储库中的所有行结尾设置为Unix,幸运的是,结果并没有像你想象的那么大。我按照这篇文章中的说明进行了操作:Trying to fix line-endings with git filter-branch, but having no luck,特别是Russ Egan的答案,这对我来说效果最好。

2 个答案:

答案 0 :(得分:1)

只需确保在下一次结帐前输入(一次):

git config --global core.autocrlf false

这将避免这种设置(默认情况下使用msysgit设置为true)的自动eol(行尾)转换。
.gitattributes文件是声明要管理其eol的文件的更好地方。

参见" git replacing LF with CRLF"有关该设置的更多信息。

答案 1 :(得分:0)

正如我最初发布在this question ...

我有一些幻影更改的文件显示为已修改,但实际上是相同的。

运行此命令有时有效:
(关闭git' s" smart"但通常无益的线路结束转换)

git config --global core.autocrlf false
git config --local core.autocrlf false

但是在另一个案例中,我发现它是由于根目录中的.gitattributes文件存在一些行结束设置,即使在某些文件被转动时也尝试对autocrlf应用.gitattributes关闭。这实际上并没有用,所以我删除了char[] managedArray = new char[yourDataObject.FileNameLength]; Marshal.Copy(yourDataObject.FileName, managedArray, 0, managedArray.Length); // and now build your string with your managed array // using Stringbuilder order something like the below string myString = new string(managedArray); ,已提交,并且该文件不再显示为已修改。