git 和 CR 与 LF(但不是 CRLF)

标签 git newline lf

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

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

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

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

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

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

最佳答案

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 行结尾 check out 。

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

关于git 和 CR 与 LF(但不是 CRLF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10491564/

相关文章:

.NET 的 Environment.NewLine 的 R 等效项

c - scanf() 没有为输入的 double 提供正确的值

Git:获得与主分支相等的分支

windows - git 如何清理克隆的存储库并重新克隆

vb.net - 使用 VB.net 在 PDF 中创建换行符

c# - 在循环语句中向文本文件添加新行

git - 未找到存储库,无法推送到私有(private)存储库

git - 数据包错误: "Package was referenced, but it was not found in the paket.lock file"

php - 如何在 php 中不换行地回显?

gradle - sourceSets的Gradle行结尾字符