为什么显示“正在更新Git索引失败”

时间:2012-05-13 17:40:12

标签: windows git newline core.autocrlf

我正在使用Windows。暂存文件时,我收到此错误。

Updating the Git index failed. A rescan will be automatically started to resynchronize git-gui.

后跟一个已从LF转换为CRLF的文件列表

在用Git使用跨平台阅读CRLF / LF问题之后,我或多或少地了解了发生了什么,我试图确定哪种autocrlf设置最适合我,但我不明白为什么Git说更新索引失败了。我的理解是它已经转换了EOF,所以它的问题是什么,为什么它告诉我更新索引失败了。我是否需要修复某些内容(除了选择适当的autocrlf设置)或者我可以继续

然后我有两个选项继续和解锁索引,这些是什么意思,什么是最好的行动方案。

3 个答案:

答案 0 :(得分:46)

git config --global core.autocrlf false

一直是我的推荐(见“Git 1.6.4 beta on Windows (msysgit) - Unix or DOS line termination”)。

但是,在您的情况下,您可以“继续”,但此警告提及某些文件的转换可能不可逆:

core.safecrlf
  

如果为true,则进行git检查,如果在行结束转换处于活动状态时转换CRLF是可逆的。 Git将验证命令是直接还是间接修改工作树中的文件。例如,提交文件后检出同一文件应该会在工作树中生成原始文件。如果core.autocrlf的当前设置不是这种情况,git将拒绝该文件   该变量可以设置为“警告”,在这种情况下,git将仅警告不可逆转换,但继续操作。

如果您不希望看到此警告,如this thread中所述,您可以将core.safecrlf设置为false

您也可以通过git gui的工具菜单存储文件,并为这些工具添加一些选项,例如git config file
关注的是,对于每个工具,您可以添加:

guitool.<name>.norescan
  

工具完成执行后,请勿重新扫描工作目录以进行更改。


  

请您详细说明解锁指数

你可以在index.tcl git-gui script中看到这条消息:它删除了操作索引时git-gui创建的index.lock文件。
您可以在"lockfile API" documentation page找到更多信息:

  

相互排斥
  当我们写出新的索引文件时,首先我们创建一个新文件$GIT_DIR/index.lock,将新内容写入其中,然后将其重命名为最终目标$GIT_DIR/index
  我们尝试使用$GIT_DIR/index.lock创建O_EXCL文件,以便当其他人已经尝试更新索引文件时我们会注意到并失败。

答案 1 :(得分:2)

即使我的core.autocrlf设置已falsecore.safecrlf未设置,我也遇到了此问题。我怀疑罪魁祸首是配置设置diff.astextplain.textconv

当我运行git config --list时,输出中显示以下行:

diff.astextplain.textconv=astextplain

我不认为此设置实际上与警告/错误相关,但它激发了我调查可能正在进行的文本转换。在网上和我的仓库中进行了一些洞察后,我在我的仓库的 .gitattributes 文件中发现了以下行:

* text=auto

[我可能从GitHub获得了 .gitattributes 文件。]

鉴于只有上述内容未被评论,并进一步处理&#39; automagic&#39;行结束转换总是令人头疼,我选择从我的仓库中删除该文件。执行此操作后,暂存相同的文件不再提示我使用&#34;更新Git索引失败&#34;警告/错误。

答案 2 :(得分:0)

TL; DR::此警告表示,即使您已签入UNIX风格的文本文件,git仍可能会以Windows风格返回文本文件。

UNIX和Windows在将换行符保存到文本文件中的方式方面有所不同。维基百科有一个list of line breaks on different OSes

如果在Windows上执行以下操作,则得到的警告是可重现的:

  • 在空目录中创建git存储库
  • 创建一个表示回购的初始,空状态的提交:

    git commit --allow-empty -m "initial commit"
    
  • 使用git config core.autocrlfgit config core.safecrlf验证autocrlf设置为truesafecrlf未设置(无输出)。如果不是这种情况,请使用以下命令进行设置

    git config core.autocrlf true
    git config --unset core.safecrlf
    
  • 使用Notepad++以UNIX格式编写名为text.txt的文本文件。编写一个至少有一个换行符的文件。这是选择UNIX行结尾的方法: Notepad++ with the menu Edit - EOL Conversion opened

  • git add text.txt。您收到警告消息

      

    警告:LF将在text.txt中替换为CRLF。
      该文件将在您的工作目录中具有其原始行结尾。

  • 提交文本文件:`git commit -m“添加带有UNIX结尾的文件”

  • 现在,如果从树中检出文件,将看到文件的外观。首先,在创建文件之前签出版本(返回1次提交)。文件text.txt从工作目录中消失:

    git checkout ~1
    
  • 现在,在创建文件后还原版本

    git checkout master
    

文件text.txt已恢复。但是在Notepad ++中打开它,并在Notepad ++的底部状态行中检查行尾格式:

The restored file which has now Windows-style CRLF endings

您检出的文件具有Windows样式的行尾,但是提交的文件却具有UNIX样式的文件尾!这就是警告消息的含义:设置core.autocrlf=truecore.safecrlf=<unset>一起表示,从树中还原的文件可能与您签入的文件不同,因为它们可能具有不同的文件结尾。