git工作目录中的更改拒绝恢复

时间:2013-10-30 15:05:17

标签: git

我的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,但也没有帮助。

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

1 个答案:

答案 0 :(得分:1)

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

如果情况确实如此,那么最有可能发生的事情是,有问题的文件的存储库版本在某种程度上具有CRLF。当你检查出来时,工作副本当然也会有那些CRLF。现在这里有一个问题:当做git statusgit 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文件中来删除它们(并删除它下面用于将文件类型设置为文本的任何行)。当我遇到这个问题时,这是我选择的选项,因为我不是我的版本控制系统更改我的文件内容的粉丝。