能否将 git 的换行符改为句号(为了更好的基于句子的差异)?

问题描述 投票:2回答:1

能否将git使用的换行符改成默认的以外的东西?\n (例如:一个时期 . 或句号加空格)?)

我之所以这么问,是因为这样可以让git更容易管理文本文件,比如文档和markdown文件。我看过一些文章,建议人们把每句话都放在自己的行里,这样git就会把它当作一个单元(而不是一个较长段落的一部分),这很不方便。因此,这里就有了问题。

我在网上搜索了一下,没有结果。

git text plaintext
1个回答
2
投票

有趣的想法!但抱歉,没有。但抱歉,没有。

我加了你的问题,因为我喜欢这个想法。不幸的是,答案是 不,Git 不支持这个功能。

正如在 git配置 的有效值。core.eollfcrlf:

设置工作目录中标记为文本的文件的行结尾类型(通过设置文本属性,或通过 text=auto,Git 自动检测内容为文本)。备选的类型有 lf、crlf 和 native,后者使用平台的本地行结束符。默认值是 native。更多关于行尾转换的信息,请参见 gitattributes[5] 。请注意,如果core.autocrlf被设置为true或input,这个值会被忽略。

其他相关的 git 配置设置有 core.safecrlfcore.autocrlf. gitattributes文档 也是这么说的。

为什么git不可能永远支持这个?

lfcf 是具有非常特殊意义的控制字符。常规字符,如句号 . 根据上下文的不同,有多种含义。在许多语言中,它标志着一个句子的结束。但在数字中,它的意思就不同了。... 常常被用来做省略号,这不是三句话的结尾。

所以git支持这样的选项,会导致许多存储在git repo中的文本文件一团糟。

解决办法是:使用 git commit hook 自动插入 lf 在你的文本文件中的每一个没有句号的句号后面。

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

通过尝试这种方法,你会发现两种情况之一。

  • (a) 酷,这对我有效!而且我的文件还是正常的文本文件,我的repo还是正常的,所以其他人可以使用它。

  • (b) 哇,现在我知道为什么他们不支持这个了。真是#$*&#@CRLF乱七八糟的东西!

为什么你真的不需要这个

之所以有 "建议大家把每一句话都放在自己的行里的文章",是因为 git diff 只支持 粒度 diffs。行差异对代码来说很好用,但对散文来说却很糟糕。插入一个句子,甚至编辑一个单词,都会导致整个段落被标记为已更改,除非该段落被分成几行。

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

类型 git help diff 或见 git-diff 文档 更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.