为什么以下命令在我的代码库中不一致?

26

我的存储库中的行尾符号混合了。

我正在使用Mac OS X和git 1.8.3.1

我想重新规范化这个存储库,使每个文件的行尾符号与.gitattributes文件一致。

为此,我已经检出了最新的更改:

git checkout origin/develop
git reset --hard
git rm -rf .
git rm --cached -rf .
rm .git/index
git checkout HEAD .gitattributes
git reset --hard
git status

现在,使用git rm --cached -rf .会导致错误,但是我对以上命令非常谨慎。在我的电脑上,那些命令在一行上,忽略了退出代码。

我重复执行这个命令很多次。(即,向上箭头;回车键;向上箭头;回车键;向上箭头;回车键;...)

大部分时间,我得到的是一个干净的检查,这不是我期望的结果。

然而,大约每十次左右,我发现我得到了三个文件(似乎已经正确地重新归一化)。其余的时间没有重新归一化。

被重新归一化(即“修改”)的文件的输出为:

$ file source/RemoveDuplications.cs
source/RemoveDuplications.cs: UTF-8 Unicode (with BOM) C++ program text, with CRLF line terminators

我的git attributes文件有很多条目,但相关的一个在这里:

* text=auto
*.cs text eol=crlf

这里可能出了什么问题?


我应该指出,显示为修改的文件是与执行以下命令时显示为修改的相同文件:find . -iname '*.cs' -exec unix2dos '{}' \; - Arafangion
这个 bug 在 homebrew 安装的 git 版本 1.8.4 中仍然存在。 - Arafangion
дҪ жҳҜеҗҰжңүе…¶д»–еёҰжңү并еҸ‘eolжҢҮд»Өзҡ„.gitattributesж–Ү件пјҹдҪ зҡ„git config core.autocrlfи®ҫзҪ®дёәfalseдәҶеҗ—пјҹ - VonC
@VonC:是的,我最初只放了*.cs这一行,然后意识到我应该按它们出现的顺序放置所有可能冲突的行——.gitattributes文件大约十几个提交前被添加到一个非规范化的存储库中,而且该存储库未被规范化。有人试图使用新的.gitattributes进行规范化,但由于这个问题,它并没有得到充分的规范化。 - Arafangion
5
你是否曾经准备好了一个测试代码库? - RyPeck
显示剩余5条评论
2个回答

1

看起来你所做的可能过于复杂了。你不需要手动从仓库中删除所有文件或删除索引。你试过这样吗:

git rm --cached -r .  # remove everything from the index
git reset --hard      # replace files w/ corrected line endings
git add .             # stage all changes
git commit -m "Normalize line endings"

如果这对您不起作用,我建议您重新检查core.autocrlf.gitattributes的值。您可能需要清除它们,重置您的shell,再次检出repo,然后重置它们以获得您想要的行为。
以下是一些其他可能有所帮助的资源:

马特:我想要在代码库本身中修复行尾,而不仅仅是工作副本。 - Arafangion

-3
你可以使用类似sed脚本的工具来编辑文件,然后重新提交它们,看看是否会再次出现这个问题。如果你从命令行执行此操作,并使用正确的正则表达式,就能够提取出可能导致问题的任何隐藏字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接