3

我的 git 工作目录中有五个文件git status显示为已修改。当我git diff他们时,整个文件显示为已更改。我有core.autocrlf true,但它似乎没有效果。

当我试图从同事那里获取更改时,真正的问题浮出水面。其中一个“修改过的”文件会被合并覆盖,所以我把它们藏起来了。令我惊讶的是,变化仍然存在。

[dev@carbon:/var/www/html/ourcustomer]$ git stash
Saved working directory and index state WIP on master: ccb93db Merge remote branch 'origin/master'
HEAD is now at ccb93db Merge remote branch 'origin/master'
[dev@carbon:/var/www/html/ourcustomer]$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   src/ourcustomer/SiteBundle/Resources/public/css/main.css
#       modified:   src/ourcustomer/SiteBundle/Resources/public/js/main.js
#       modified:   src/ourcustomer/SiteBundle/Resources/public/js/ourcompany-resize.js
#       modified:   src/ourcustomer/SiteBundle/Resources/views/Login/languageSelector.html.twig
#       modified:   src/ourcustomer/SiteBundle/Resources/views/layout.html.twig
#
no changes added to commit (use "git add" and/or "git commit -a")

在此之后,我尝试了git reset --hard HEAD- 结果相同。我也尝试过git checkout -- src/ourcustomer/SiteBundle/Resources/public/css/main.css,但它也没有帮助。

这里有什么问题?有什么方法可以解决这个问题,还是我应该再次删除并克隆整个存储库?

4

1 回答 1

1

对于正在发生的事情,我最好的猜测是你在一台 Windows 机器上,并且在你的.gitattributes文件中的某处你有一个指令告诉 git 执行行结束规范化(通过* text=auto或类似的东西)。如果确实如此,那么当您签出文件时,其 LF 将转换为 CRLF,而当您提交文件时,其 CRLF 将转换为 LF。

如果确实如此,那么最有可能发生的情况是相关文件的存储库版本以某种方式在其中包含 CRLF。当您检查它们时,工作副本当然也有那些 CRLF。现在问题来了:当执行git status,git diff等时,git 将 repo/index 中的内容与工作目录中的实际内容进行比较,而不是与完成行结束规范化后将提交的内容进行比较,即 CRLF 替换为LF。在这种情况下,git 会看到 index/repo 中的内容具有 CRLF,而您提交的内容只有 LF,因此存在差异。

要查看是否是这种情况,请运行以下命令:

git hash-object src/ourcustomer/SiteBundle/Resources/public/css/main.css 
git hash-object --no-filter src/ourcustomer/SiteBundle/Resources/public/css/main.css 
git ls-files -s src/ourcustomer/SiteBundle/Resources/public/css/main.css 

第一个命令将向您显示提交的哈希值。第二个命令向您显示工作目录中实际内容的哈希值。第三个命令显示索引中内容的哈希值。如果第一个和第二个哈希值不同,而第二个和第三个哈希值相同,那么您几乎肯定处于我所描述的情况。

那么问题来了,如何摆脱呢?一种简单的方法是简单地添加/提交“更改”。这将具有将 LF 放入存储库副本中的效果,从而解决了未来的问题。但是,如果使用存储库的每个人都在 Windows 上,那么无论如何都不需要行规范化。* -text您可以通过放入文件来禁用它们.gitattributes(并删除它下面将文件类型设置为文本的任何行)。这是我遇到这个问题时选择的选项,因为我不喜欢我的版本控制系统更改我的文件内容。

于 2015-06-06T20:49:24.950 回答