git line endings - 无法存储,重置,现在无法通过虚假行结尾提交

时间:2014-01-14 19:19:44

标签: git line-endings

我有一个回购我添加了一个gitattributes并正在努力。我通过Dropbox将它同步到另一台机器。当我把它打开到另一台机器时,一堆文件突然出现在未分区上作为总差异(所有文件都是一个巨大的差异,这意味着行结束差异) - 我的crlf结局基本上是{{1我在Windows上工作。我试图隐藏更改,重置分支等。最后我决定提交文件然后做了一些其他提交我想在行结束提交之前重新排序(和压缩)。当我尝试变基时,我得到了一个:

.* text=auto

当然藏匿不起作用

这是一个错误吗?

相关:

编辑与机器无关 - 在同一台机器上,某些(...)操作只会使这些文件(它们在error: Your local changes to the following files would be overwritten by merge # those same files Please, commit your changes or stash them before you can merge. Aborting Could not apply 89b25b81fff1a1e7893319e123aaaca9c4162a95... <commit message> 上作为文本)出现在&#中34;变更&#34;部分。似乎存在的唯一解决方法是:

.gitattributes

小心使用

编辑:hack上面转移到别名状态:

git rm --cached -r .
git reset --hard

UPDATE 2015.09.30 :我在Windows 7中使用的NTFS分区中有一个git repo,在双启动环境中使用linux。当我关闭窗口时,我启动到拱门两个文件(html)显示为总差异(行结束差异)。上面的解决方法不起作用 - 除非你多次应用它来刷新gui ...

我的[alias] crlf = !git rm -r . --cached -q && git reset --hard

.gitattributes

NB :linux会让我提交,切换分支机构等但不会让我反驳 - 加上那些差异总是出现在gitk / git gui。

2018/12/14 移至Mac,我的解决方法不再有效。我在git邮件列表中发了一条消息:https://marc.info/?l=git&m=154482149623324&w=2

我们希望这会得到一些关注

* text=auto

*.py text diff=python
*.html text
.project text
*.pkl -text

# M$ files
*.bat text eol=crlf

# UNIX files
**/generate_second_post text eol=lf

# git files - have them with LF, as I edit them via the shell (echo etc)
*.gitignore text eol=lf
*.gitattributes text eol=lf

6 个答案:

答案 0 :(得分:7)

最后五年之后,有了TorstenBögershausen,这是一个完整的答案。

调试这种eol情况的方法是使用TorstenBögershausen添加的--eol switch to git ls-files进行调查。原来有问题的文件是使用CRLF提交的,而后来添加的.gitattributes文件为这些文件指定了text。结果为in an "illegal state"。对于旧的提交,什么也没做。

应该做的是git add --renormalize .,以便添加带有正确(lf)行尾的文件,然后重新设置-很难使这些行尾出现在工作树中。

但是,现在这对旧的提交无济于事(处于这种非法状态的提交,因此在文件之间以错误的行尾提交和gitattributes提交之间)-检查这些提交可能会导致那些不可重置的更改。此修补程序由@iKlsR的answer提供:

$ cat .git/info/attributes
"Mopy/Docs/Bash Readme Template.html" -text

原因是that

  

在确定将哪些属性分配给路径时,Git会查询$ GIT_DIR / info / attributes文件(优先级最高的 ),. gitattributes文件位于与该路径相同的目录中,及其父目录直到工作树[ ect ]

的顶层

(重点是我的)

只需确保在 重新规范化之后添加行,否则文件将不会添加到重新规范化提交中!

答案 1 :(得分:4)

我们今天遇到了这个问题,似乎问题源于与新添加的.gitattributes文件相关的一些CRLF相关问题,其中包含一行* text=auto。当您重新设置或创建一个新分支时,所述文件将跟随您并破坏之后发生的任何更改,并阻止您在未事先提交的情况下离开该分支。

我们最初通过签出一个临时分支来修复此问题,将文件恢复到理智状态(修改前),提交然后在整个分支上执行rebase回到最早的提交让它看起来像主人。这工作了一段时间,但之后出现了类似的文件,同样的修复程序再次没有用。

我们最终使用的内容与他在更新中分享的内容类似。.git/info/attributesfile-to-remove -text内的一行似乎可以缓解此问题。我说缓解是因为我不确定这样做是否有任何不利影响,这也适用于一个文件,所以可能效果不好。

答案 2 :(得分:1)

你试过这个吗?

git add -u .
git reset

答案 3 :(得分:1)

今天我发生了同样的问题。试试这个

git config --local core.fileMode false

如下所述:How do I make Git ignore file mode (chmod) changes?

答案 4 :(得分:0)

同一问题,我正在使用Win7,sourceTree v3.0.9,git v1.9.5

在回购根目录中,当.gitattribute文件具有text = auto时,它显示有关行尾的许多本地文件更改,这使我无法执行任何操作。 设置text = crlf后,所有本地更改都消失了。

以前,我曾尝试在配置文件中添加“ [core] autocrlf = false”,但这没有帮助。

已于2018年6月6日更新:我的SourceTree正在使用旧版本的嵌入式git,只需在SourceTree中对其进行更新,现在一切都可以在.gitattributes中使用“ text = auto”

答案 5 :(得分:0)

这些都不在我的Windows 10 WSL上起作用,我在README.md中存在差异,并且无法提取更改,因此我从

echo README.md >> .gitignore # not sure if this is needed
rm README.md # this need to be rm without git
git pull
git checkout .gitignore # to remove the change

我认为只要您这样做,它也会起作用:

rm file
git checkout <branch>

但是我无法测试,因为我的仓库正在运行。