50

我正在使用 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 设置)还是我可以继续

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

4

4 回答 4

55
git config --global core.autocrlf false

一直是我的建议(请参阅“ Windows 上的 Git 1.6.4 beta (msysgit) - Unix 或 DOS 行终止”)。

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

core.safecrlf

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

如果您不想看到此警告,如此线程中所述,您可以设置core.safecrlffalse.

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

guitool.<name>.norescan

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


你能详细说明一下解锁索引吗

index.tcl您可以在git-gui 脚本中看到该消息:它删除了 git-gui 在操作索引时创建的 index.lock 文件。
您可以在“lockfile API”文档页面查看更多信息:

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

于 2012-05-13T19:02:36.480 回答
2

即使我的core.autocrlf设置已经设置false并且core.safecrlf未设置,我也遇到了这个问题。我怀疑罪魁祸首是配置设置diff.astextplain.textconv

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

diff.astextplain.textconv=astextplain

我认为此设置实际上与警告/错误无关,但它启发了我研究可能正在进行的文本转换。在网上和我的 repo 中进行了一些探索之后,我在 repo 的.gitattributes文件中发现了以下行:

* text=auto

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

鉴于只有上面的行没有被注释,而且处理“自动”行结束转换一直是一个令人头疼的问题,我选择从我的仓库中删除该文件。这样做之后,暂存相同的文件不再提示我“更新 Git 索引失败”警告/错误。

于 2016-09-26T15:41:51.250 回答
1

TL;DR:这个警告意味着尽管你签入了一个 UNIX 风格的文本文件,git 可能会返回一个 Windows 风格的文本文件。

UNIX 和 Windows 在文本文件中保存换行符的方式不同。维基百科有一个不同操作系统上的换行符列表

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

  • 在空目录中创建一个 git 存储库
  • 创建一个代表仓库初始空状态的提交:

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

    git config core.autocrlf true
    git config --unset core.safecrlf
    
  • 使用Notepad++text.txt编写一个以 UNIX 格式调用的文本文件。编写一个至少有一个换行符的文件。这是您选择 UNIX 行尾的方式: 带有菜单编辑的记事本++ - 打开了 EOL 转换

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

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

  • 提交文本文件:`git commit -m "add file with UNIX ending"

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

    git checkout ~1
    
  • 现在,在创建文件后恢复版本

    git checkout master
    

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

恢复的文件现在具有 Windows 样式的 CRLF 结尾

您签出的文件具有 Windows 样式的行结尾,而您提交的文件具有 UNIX 样式的文件结尾!这就是警告消息的内容:这些设置意味着您从树中恢复的文件可能core.autocrlf=truecore.safecrlf=<unset>您签入的文件不同,因为它们可能具有不同的文件结尾。

于 2018-09-25T09:11:29.360 回答
0

更直接的答案:

Git 告诉您当前工作区文件的行尾与预期不同。听起来您已经阅读过。就个人而言,我认为最好的解决方案是在 .gitattributes 文件中定义所需的行尾: *.py text eol=lf *.bat text eol=crlf

现在对于每个人都拒绝回答的问题:

Git Gui 中的“解锁索引”有什么作用?它会删除“.git/index.lock”文件,以便您可以在继续之前运行其他 git 命令。Git GUI 将在启动 Git 命令时创建此文件,这样没有其他 git 进程会干扰和破坏您的本地存储库。完成后它会删除 index.lock 。

底线: 单击“解锁索引”在这里不会做任何有用的事情,只有在调试 Git Gui 本身时才应该单击它。它很少使用,以至于大多数人甚至不知道它的作用,也不在乎。

于 2021-10-27T16:32:49.200 回答