【问题标题】:Phantom local changes showing in Git在 Git 中显示的幻像本地更改
【发布时间】:2014-05-12 01:41:21
【问题描述】:

我在这里遇到了一个非常奇怪的 git 错误,这让我完全不知所措。这不是一个主要的障碍,但一直在工作非常烦人。

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

  1. 这是在 Windows 上
  2. Git 状态显示文件已更改(每一行都已更改,示例请参见随附的屏幕截图)
  3. Beyond compare 显示没有差异;文件编码和行尾相同,两个文件的字节数完全相同。
  4. 奇怪的是:我无法重置更改,无论它们是什么。即使删除文件然后重置删除也会导致新文件被更改。

这里会发生什么?我认为这可能与文件属性有关,但我不知道如何检查。


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

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

【问题讨论】:

    标签: windows git working-directory


    【解决方案1】:

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

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

    运行此命令有时有效:
    (关闭 git 的“智能”但通常无用的行尾转换)

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

    但在另一种情况下,我发现这是由于根目录中的 .gitattributes 文件存在一些行尾设置,即使它已关闭,它仍试图将 autocrlf 应用于某些文件。这实际上并没有什么帮助,所以我删除了.gitattributes,提交,文件不再显示为已修改。

    【讨论】:

      【解决方案2】:

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

      git config --global core.autocrlf false
      

      这将避免这种设置(默认情况下使用 msysgit 设置为 true)所做的那种自动 eol(行尾)转换。
      .gitattributes 文件是声明所需文件的更好位置管理他们的 eol。

      有关该设置的更多信息,请参阅“git replacing LF with CRLF”。

      【讨论】:

      • 我不确定是不是这样,因为“超出比较显示没有差异;文件编码和行结尾是相同的”。行尾的变化不会显示在差异中吗?
      • @Richiban 我仍然会确保 core.autocrlf 确实设置为 false,看看问题是否仍然存在。
      • 虽然我还没有完全弄清楚,但我认为这是问题所在。出于某种原因,Git 将行尾显示为相同的前后,这让我感到震惊。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2016-03-21
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      相关资源
      最近更新 更多