我正在使用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设置)或者我可以继续
然后我有两个选项继续和解锁索引,这些是什么意思,什么是最好的行动方案。
答案 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
设置已false
且core.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 commit --allow-empty -m "initial commit"
使用git config core.autocrlf
和git config core.safecrlf
验证autocrlf
设置为true
且safecrlf
未设置(无输出)。如果不是这种情况,请使用以下命令进行设置
git config core.autocrlf true
git config --unset core.safecrlf
使用Notepad++以UNIX格式编写名为text.txt
的文本文件。编写一个至少有一个换行符的文件。这是选择UNIX行结尾的方法:
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 ++的底部状态行中检查行尾格式:
您检出的文件具有Windows样式的行尾,但是提交的文件却具有UNIX样式的文件尾!这就是警告消息的含义:设置core.autocrlf=true
和core.safecrlf=<unset>
一起表示,从树中还原的文件可能与您签入的文件不同,因为它们可能具有不同的文件结尾。