繁体   English   中英

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

[英]Changes in git working directory refuse to be reverted

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

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

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

如果情况确实如此,那么最有可能发生的事情是,有问题的文件的存储库版本在某种程度上具有CRLF。 当你检查出来时,工作副本当然也会有那些CRLF。 现在,这里的难题是:做的时候git statusgit diff等混帐比较的是在回购/指数没有什么实际上是在你的工作目录,但你行结束正常化后提交完成后,即用CRLF取代了LFs。 在这种情况下,Git把什么是索引/回购有CRLFs,以及你只会犯有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上,那么无论如何都不需要行规范化。 您可以通过在.gitattributes文件中放入* -text .gitattributes来禁用它们(并删除它下面用于将文件类型设置为文本的任何行)。 当我遇到这个问题时,这是我选择的选项,因为我不是我的版本控制系统更改我的文件内容的粉丝。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM