79

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

在本地克隆我的项目后,我注意到所有这些文件都带有 git status modified。我从未修改过它们,所以我尝试过修改它们discard changesreset但它们又出现了。修改中的更改是删除所有行并再次添加它们。

我不确定为什么会发生这种情况或如何修复它,以便我的 git 状态按照需要保持干净。

以下是 git status 中的几行:

#   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.
...
4

4 回答 4

112

规范化行尾

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

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

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

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格式和空白的相关部分。

解决 linux 机器冲突

登台服务器被锁定,因为它不会提取新的编辑。

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

$ git fetch origin
# Retrieve updates

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

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

于 2013-09-18T15:06:37.197 回答
15

我总是提到确保您core.autocrlf的设置为false,如“ Git : 在 crlf 规范化后使用 stash 卡住 repo?

git config --global core.autocrlf false

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


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

我在 Mac 上,这个晦涩的配置更改似乎解决了我在没有临时更改时遇到的所有问题。

git config --global core.trustctime false
于 2013-09-18T15:13:20.690 回答
12

我刚刚用 .svg 文件(标量矢量图形)在同一个问题上花了 2 个小时(!),在没有我干预的情况下,它在“恢复”后不断变化。

因此文件在'git status'中显示为已修改;恢复它成功,但它一直在变化,所以“拉”一次又一次地失败......太烦人了!

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

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

太简单了,我哭了!

于 2017-06-20T07:40:34.167 回答
5

这个问题在 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中间工作。

于 2017-08-08T10:07:48.760 回答