git和CR vs LF(但不是CRLF)

时间:2012-05-08 02:01:27

标签: git newline lf

这听起来像是一个多余的问题(很可能是一个冗长的问题),但我无法找到答案。情况如下:

我的应用程序正在创建将CR作为行结尾的文本文件。更具体地说,我没有明确地将行结尾设置为CR,它恰好是我用来获取文本正文的命令的输出。当然,我可以手动将CR转换为LF,但如果我能避免,我也不想这样做。

Git将这些文件视为一行(例如在差异期间)。我已通过此测试存储库确定行结尾是原因:https://github.com/jfletcher4d/diff-test

我实际上并不关心文件系统中的行结尾。它并不重要,至少现在还没有(如果我需要导入这些文件,我可能最终会关心,现在它只能导出)。但是我想要在我的应用程序中将CR转换为LF,如果我可以避免它,出于性能原因以及肛门保留原因:) I.e.这不是一个如何创建文本文件的问题,而是如何强制在repo中的每个文本文件只有LF。

是否可以将git配置为将所有行结尾更改为LF,即使文件是使用CR提交的呢?

我在Windows上,使用TortoiseGit和msysgit(以及一些TortoiseSVN)可以互换,而我学习git,如果这很重要的话。

2 个答案:

答案 0 :(得分:10)

Git似乎不支持CR行结尾,因此我会写一个filter来转换换行符。工作树中的文件将具有CR行结尾,并且在索引时它们将透明地转换为LF。过滤器有两部分:“clean”检查文件,“smudge”检查文件。

.git/config

中使用此功能
[filter "cr"]
    clean = tr '\\r' '\\n'
    smudge = tr '\\n' '\\r'

.git/info/attributes(或.gitattributes如果应该版本化)

* filter=cr

请注意,这会自动使git-diff满意,因为它会使用“干净”版本。

请记住将模式设置为您需要的文件,否则二进制文件将被破坏,所有文本文件都将以CR行结尾签出。

另请注意,如果未配置过滤器,它将无提示失败,因此在设置存储库的新副本时添加配置行。

答案 1 :(得分:2)

FWIW,我最终将线路结尾转换为本地方面的LF。它最终成为更简单/更少的错误解决方案。