使用`.gitattributes`文件修复Git代码库中的行尾,换行符问题

4

需要修复的问题:

我有一个仓库,其中包含一个单独的.md文件,里面包含我正在写作的一篇文章。

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

现在在Windows中查看经过一些更改的git diff时,我可以看到我的文章显示为漂亮的分隔线......即将被一个长行替换,其中原来的段落被^M分隔。

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

diff结果表明我可能在Linux中开始了这个文件(完全可能;我不记得了),然后在Windows中保存了它,并且所有行尾都被替换了。

我想能够跨越两个操作系统打开文件,以便行显示正确,并且有一个diff结果显示换行符(而不是^M占位符)和实际内容的更改。

我尝试过的:

我做了一些背景阅读,阅读了有关行尾和Git设置的很好的概述,甚至尝试按照另一个Stack Overflow问题中的命令。

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

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

我尝试过这个 (来源):

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

以下是相关内容的翻译(来源):

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纯粹地完成这一过程,但是我感到很沮丧。)很乐意回答问题并提供更多细节。您有任何想法我可能错过了什么步骤吗?

顺便提一下,您可以定义别名,将“-Xignore-all-space”添加到diff和merge中,这样您就不会被空格更改所困扰(您可能想寻找一种仅忽略行结束符而不是所有空格的策略)。 - Shahbaz
谢谢@Shahbaz,我稍后会尝试一下并回报。 - guypursey
1个回答

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的默认值是native。所以,我期望git只使用LF来检出我的文件。但是似乎由于某种原因,它并没有这样做。因此,我的.gitattributes的理解可能有误,或者我们需要向git提交错误报告...

无论如何,在.gitattributes中明确设置eol=native对我起到了作用,就像我所说的那样。


嗨 @eleom,谢谢你的回答。它确实在我的一台电脑上起作用了,我进一步研究了一下,我想我对你关于 eol 的期望所暗示的问题有一些答案。我会从我的其他电脑上检查这个(希望今天晚些时候),如果它们也能正常工作,我会将其标记为正确并添加更多信息。再次感谢。 - guypursey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接