使用`.gitattributes`文件修复Git存储库中的行结尾

时间:2014-02-17 12:17:13

标签: linux windows git eol gitattributes

需要修理的内容:

我有一个包含单个.md文件的存储库,其中包含我正在撰写的一篇文章。

我从几台不同的计算机编辑文件,一台运行Linux,另一台运行Windows。

现在看一下Windows中的git diff,我已经做了一些更改,我可以看到我的文章显示为完全分开的文本行...所有即将删除并替换为一条长行,其中有什么是段落以^M s分隔。

我知道^M是指Windows的CLRF行结尾。

diff结果意味着我在Linux中启动了文件(完全可能;我不记得了)并且已经将其保存在Windows中并且所有行结尾都已被替换。

我希望能够在两个操作系统中打开文件,并显示按行显示的行,并且diff结果显示换行符(而不是^M占位符)并且只有更改为实际内容。

我尝试了什么:

我做了一些background reading,阅读nice overview行结尾和Git设置,甚至尝试按照another Stack Overflow question中的命令。

目前我在存储库顶层有一个.gitattributes文件,我已将其提交给存储库本身。它只包含两行:

# These files are text and should be normalised (convert Windows' CLRF to LF)
*.md text

我试过这个(source):

git rm --cached -r .
git reset --hard
git add .
git commit -m "Normalize line endings"

这个(source):

git rm --cached -r .
git config core.autocrlf input
git diff --cached --name-only -z | xargs -0 git add
git commit -m "Fixed crlf issue"

在第二种情况下,最后一个命令告诉我没有任何提交。 (我也不喜欢改变core.autoclrf的想法,因为我试图纯粹通过.gitattributes来做这件事,但我感到很沮丧。)

很乐意回答问题并提供更多详情。我可能会出错的任何想法?我错过了一步吗?

1 个答案:

答案 0 :(得分:1)

尝试使用

*.md text eol=native

而不是

*.md text
你的.gitattributes中的

我确实在其中设置了一个带有CR-LF文件的小型测试仓库,并按照您的第一个程序执行标准化:

git rm --cached -r .
git reset --hard
git add .
git commit -m "Normalize line endings"

在办理登机手续时正确规范了档案。 但是,奇怪的是,即使我在OSX上,它仍然在退房时保持CR-LF。

据说,core.eol的默认值是原生的。所以,我希望git只使用LF来检查我的文件。但似乎出于某种原因,它只是没有这样做。 所以,我对.gitattributes的理解是有缺陷的,或者我们有一个bug被提交给git ......

在任何情况下,正如我所说的那样,在.gitattributes中明确设置eol = native对我来说是个窍门。