Git拒绝重置/丢弃文件


76

我有一个包含某些无法更新的js文件的项目。我在本地运行OSX,而​​我的远程/临时服务器是Linux(CentOS)。

在本地克隆项目后,我立即注意到所有这些文件的状态均为git modified。我从来没有修改他们,所以我想discard changes还是reset他们,但他们再次出现。修改中的更改是删除所有行,然后再次添加它们。

我不确定为什么会发生这种情况或如何解决它,以便我的git状态如所需要的那样干净。

这是git状态的几行:

#   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/el.js
#   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/fa.js
#   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/gu.js

更新1:

现在,我已经成功提交了上述文件,但是登台服务器已被锁定,因为它不会拉出新的编辑内容:

error: Your local changes to the following files would be overwritten by merge:
    app/webroot/js/ckeditor/_source/lang/ar.js
    app/webroot/js/ckeditor/_source/lang/bg.js
    app/webroot/js/ckeditor/_source/lang/bn.js
    app/webroot/js/ckeditor/_source/lang/cs.js
    ...
Aborting

我无法提交/推送,因为:

Updates were rejected because a pushed branch tip is behind its remote counterpart

我试过了:

git reset --hard

git stash
git stash drop

但是它们不起作用,什么也没发生。

更新2:

git diff 给我:

The file will have its original line endings in your working directory.
warning: CRLF will be replaced by LF in app/webroot/js/ckeditor/_source/lang/fa.js.
The file will have its original line endings in your working directory.
warning: CRLF will be replaced by LF in app/webroot/js/ckeditor/_source/lang/gu.js.
The file will have its original line endings in your working directory.
...

如果文件一遍又一遍地显示为已修改,请检查本地文件和存储库文件之间是否有换行符,控制字符等任何区别。
舜亚

不,没有。与所有行相反,它只会显示1行更改。同样,如果有任何实际更改,我应该可以将其丢弃,在这种情况下,它是行不通的。
mgPePe

Answers:


106

规范行尾

修改中的更改是删除所有行,然后再次添加它们。

这是因为正在提交的文件和磁盘上的文件之间更改换行符。

Github上有一个方便的页面,详细介绍了如何处理此类问题,简而言之(对于linux / OSX),第一步是更改git config,以便它为您整理行尾:

git config --global core.autocrlf input

然后提交行尾归一化:

git rm --cached -r .
# Remove everything from the index.

git reset --hard
# Write both the index and working directory from git's database.

git add .
# Prepare to make a commit by staging all the files that will get normalized.
# This is your chance to inspect which files were never normalized. You should
# get lots of messages like: "warning: CRLF will be replaced by LF in file."

git commit -m "Normalize line endings"
# Commit

然后,应正确处理行尾。有关更多信息,请参见github上的帮助页面,或git docs formatting和whitespace的相关部分。

解决linux机器冲突

登台服务器被锁定,因为它不会拉出新的编辑内容。

错误消息显示为“您对以下文件的本地更改将被merge:覆盖”,这意味着它们包含本地更改,应在继续之前将其提交或丢弃。假设登台服务器的正常使用情况(它没有任何有意更改),则可以放弃本地更改。例如,执行以下操作:

$ git fetch origin
# Retrieve updates

$ git reset --hard origin/master
# Forcibly change the current branch to match origin/master

这将检索存储库历史记录,而不更新工作副本,然后更新为与存储库中的主分支完全匹配。请注意,最后一条命令将放弃所有未提交的更改。


谢谢!如此完整的答案,您已解决了提交冲突!
mgPePe 2013年

1
你救了我一个下午的伤。
杰里·布雷迪

我收到类似的问题,但有图像。您认为这与这个答案有关吗?
2014年

也许-有什么区别:行结尾,可执行文件或其他内容?对于“是的”以外的任何回答->提出引用此问题的问题。如果存在差异,则相关的差异是图像文件是二进制文件,因此不应受到任何与行尾相关的影响。
AD7six 2014年

1
我们有一个由善意的承包商组成的团队,在添加.gitattributes的同时,所有行结束标准化已启用。当开发人员无法切换分支时,这会引起混乱,因为这会破坏索引。这个答案帮助我们清除了缓存并重建了索引(git rm --cached -r和git reset --hard),但是对我们来说最好的解决方案是完全删除.gitattributes,以便一切工作都像以前一样改变了。
新手

14

我总是提到确保将您core.autocrlf的设置为false,如“ Git:在crlf归一化后使用stash卡住回购?

git config --global core.autocrlf false

还要确保您没有一个.gitattributes带有eol指令的文件,该指令会尝试转换行尾。
基本思想是:确保没有任何类型的自动转换时,仍然看到该错误消息吗?


但是,以防万一,请考虑“ Git rebase失败,'您对以下文件的本地更改将被合并覆盖'。是否没有本地更改?

我在Mac上,这种晦涩的配置更改似乎解决了我在无暂存更改时遇到的所有麻烦。

git config --global core.trustctime false

2
好建议。如果没有Windows用户进行协作以换行,或者如果问题仅在于供应商文件,则最合适。但是,如果有WINDOWS + MAC / Linux用户的混合团队-这将导致这取决于谁最后感动的文件永久的空白变化。+1。
AD7six 2013年

1
感谢您的.gitattributes信息。不知道 就我而言,这就是我不能放弃更改的原因。现在问题解决了!
informatik01

1
.gitattributes文件与eol是我的情况。谢谢!
JohnnyFun

10

我只用了2个小时(!),就用一个.svg文件(标量矢量图形)处理了同样的问题,该文件在“还原”后不断更改,而无需我的干预。

因此文件显示为'git status'中的修改内容;恢复成功,但它不断变化,因此“拉”一次又一次失败..太烦人了!

'git reset'' gitignore''git untrack'等没有运气...

最后,我通过从本地系统中删除文件(不是'git delete',只是Shift + Delete)来解决它>>现在'pull'请求通过了,并从远程存储库中获取了文件。

太容易了,我可以哭了!


1
有趣的替代方法。+1
VonC

如果您因为签出过去的提交而卡住了,这就是答案(这意味着您无法按照所选答案中的说明添加提交)
lulalala

1
绝对对我来说,这是最简单的解决方案。谢谢。
nersoh

4

这个问题在Ubuntu机器上的Roll20字符表存储库中反复弹出,我可以通过以下方法解决

#!/bin/sh

# Use in root dir of git repository
# Fixes some newline-related weirdness
git rm --cached -r .
git reset --hard

但是,今天这完全无法解决问题,通过查看Stack Overflow,我发现罪魁祸首是他们的.gitattributes文件:

# Auto detect text files and perform LF normalization
* text=auto

之后git pull origin mastergit status返回:

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Star Wars Revised RPG/SWRRPG-updated.html

no changes added to commit (use "git add" and/or "git commit -a")

解决方案是* text=auto从.gitattributes中删除该行:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   .gitattributes

no changes added to commit (use "git add" and/or "git commit -a")

.gitattributes可以放弃对的更改,并且仍然可以满足Git。

编辑+ 1d:今天重试了.gitattributes的“技巧”,但是git status在放弃.gitattributes更改之前没有尝试。毫无理由对我来说(可能是缓存git status?),git status此后再次返回了此信息:

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Star Wars Revised RPG/SWRRPG-updated.html

no changes added to commit (use "git add" and/or "git commit -a")

再做一次,但git status中间可行。


有据可查。+1
VonC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.