8

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

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

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

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

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

我在 Windows 上,在学习 git 的同时交替使用 TortoiseGit 和 msysgit(还有一点 TortoiseSVN),如果这很重要的话。

4

2 回答 2

11

Git 似乎不支持 CR 行尾,所以我会编写一个过滤器来转换换行符。工作树中的文件将以 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 行结尾签出。

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

于 2012-05-08T02:50:28.850 回答
2

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

于 2012-11-06T23:43:08.527 回答