可以将 git 换行符更改为句点(以获得更好的基于句子的差异)?



是否可以将 git 使用的换行符更改为默认n以外的其他值(例如句点.或句点加空格(?

我问是因为这样可以更轻松地使用 git 来管理文本文件,例如文档和降价文件。我看过一些文章建议人们将每个句子放在自己的行中,以便 git 将其视为一个单元(而不是较长段落的一部分(,这很尴尬。因此,这里有一个问题。

我做了一些互联网搜索无济于事。

有趣的想法!但对不起,没有。

我赞成你的问题,因为我喜欢这个想法。不幸的是,答案是:不,Git 不支持这一点。

如 git 配置文档中所述,core.eol的有效值是lfcrlf

设置要在工作目录中用于标记为文本的文件的行结束类型(通过设置 text 属性,或者通过让 text=auto 和 Git 自动将内容检测为文本(。替代方案是 lf、crlf 和 native,它们使用平台的原生行尾。默认值为本机值。参见 gitattributes[5] 以了解有关下线转换的更多信息。请注意,如果 core.autocrlf 设置为 true 或 input,则会忽略此值。

其他相关的 git 配置设置是core.safecrlfcore.autocrlf。 gitattributes 文档也说了同样的话。

为什么 Git 不太可能支持这一点

lfcf是具有非常特定含义的控制字符。句点.等常规字符具有多种含义,具体取决于上下文。在许多语言中,它标志着句子的结尾。但它在数字上意味着不同的东西。...通常用作省略号,不是三个句子结尾。

因此,支持此类选项的 git 会导致存储在 git 存储库中的许多文本文件一团糟。

解决方法:使用 Git 提交hook在文本文件中没有句点的每个句点后自动插入lf

这将是一个非常简单的正则表达式。

通过尝试这种方法,您会发现以下两件事之一:

  • (a( 酷,它对我有用!我的文件仍然是普通的文本文件,我的存储库仍然是正常的,因此其他人可以使用它。

  • (b(哇,现在我知道他们为什么不支持这个了。真是#$*&#@CRLF一团糟!

为什么你真的不需要这个

之所以有"文章建议人们将每个句子放在自己的行中",是因为git diff用于仅支持行粒度差异。行差异非常适合代码,但对于散文来说很糟糕。插入一个句子甚至编辑一个单词会导致整个段落被标记为已更改,除非该段落被分解成行。

但是git diff现在支持单词粒度,如果您使用--word-diff[=<mode>]--word-diff-regex=<regex>--color-words[=<regex>]选项。

键入git help diff或查看 git-diff 文档以获取更多信息。

相关内容

最新更新