如何让Git在索引中存储CRLF

xvw2m8pv  于 2023-04-19  发布在  Git
关注(0)|答案(3)|浏览(117)

我在工作中使用git-svn,人们经常抱怨我提交的是LF而不是CRLF(我们主要是Windows商店)。
据我所知,当core.autocrlftrue时,工作副本是CRLF,当falseLF,当input保持不变。我喜欢autocrlf = true作为一个概念,但我希望它在索引中默认为CRLF,因为这是get提交给SVN的内容。

有没有办法设置索引的行尾?

我见过core.eol,但这似乎也只设置了工作副本使用的内容,而不是索引。

llycmphe

llycmphe1#

你需要在项目的根目录下添加一个名为.gitattributes的文件。这将强制每个人提交相同的行结尾。在你的例子中,当你想要强制crlf时,你需要在.gitattributes中添加这行:

* text eol=crlf

然后,您还可以将repo中的每个文件正常化一次,并且不再为此烦恼:尝试使用git filter-branch修复行结尾,但没有成功
你也可以参考github guide中关于行结尾的部分:https://help.github.com/articles/dealing-with-line-endings

8qgya5xd

8qgya5xd2#

原来git-svn使用SVN中的svn:eol-style属性来决定如何存储行尾。如果你进入一个纯SVN checkout 并添加svn:eol-style设置为native,Git将在Windows中使用CRLF,在Linux/OSX中使用LF。
我也有这些设置:

$ git config core.autocrlf false
$ git config core.safecrlf true

我的.gitattributes文件中没有任何内容。

44u64gxh

44u64gxh3#

我知道这个问题很老了,但以防万一有人还在寻找答案。。
首先,你必须确保core.autocrlf在你的全局和本地配置中都是false。然后要强制git转换为CRLF,你可以使用这样定义的过滤器:
在本地config文件(.git\config)中:

[filter "crlf"]
        clean = unix2dos

您可以通过在attribute文件(.git\info\attributes)中为某些文件添加过滤器来使用它:

*.txt filter=crlf

这个过滤器使用unix2dos命令,如果你在Linux上,这个命令可能已经可用了。否则,你可以使用install it或使用一个替代命令,如sed -i -e 's/\r//g'(这个命令工作得很好,假设你的文件中没有任何Mac行结尾)。
像这样对所有文件运行过滤器怎么样?

* filter=crlf

这可以工作,但我没有在大型repo中使用过它,所以我不能保证它不会影响性能,或者是否有损坏二进制文件的风险。
幸运的是,unix2dos有一些检查来检测二进制文件,如果它们被检测为二进制文件,则不会对其进行任何更改。我尝试在PNG上运行它,得到:

unix2dos: Binary symbol 0x1A found at line 2
unix2dos: Skipping binary file fff.png

但是,如果某些文件未被正确检测到,您可能需要保持警惕。

相关问题