git 和 CR vs LF(但不是 CRLF)



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

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

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

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

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

我在Windows上,在我学习git时交替使用TortoiseGit和msysgit(以及侧面的一点TortoiseSVN(,如果这很重要的话。

Git 似乎不支持 CR 行尾,所以我会写一个过滤器来转换换行符。工作树中的文件将具有 CR 行结尾,并且在编制索引时,它们将被透明地转换为 LF。过滤器分为两部分:"干净"检入文件,"污迹"检出文件。

.git/config中使用此功能:

[filter "cr"]
    clean = tr '\r' '\n'
    smudge = tr '\n' '\r'

.git/info/attributes(或.gitattributes是否应该对其进行版本控制(

* filter=cr

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

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

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

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

最新更新