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

是否可以将git换行符更改为句点(以获得更好的基于句子的差异)?,git,text,plaintext,Git,Text,Plaintext,是否可以将git使用的换行符更改为默认的\n(例如句点或句点加空格) 我这样问是因为这样可以更容易地使用git来管理文档和标记文件等文本文件。我看过一些文章建议人们把每个句子放在自己的行中,这样git就可以把它当作一个单元(而不是一个较长段落的一部分),这很尴尬。这就是问题所在 我在网上搜索了一下,但没有结果。真是个有趣的主意!但是对不起,没有。 我对你的问题投了赞成票,因为我喜欢这个主意。不幸的是,答案是:不,Git不支持这一点 如文件所述,core.eol的有效值为lf和crlf: 为标记为

是否可以将git使用的换行符更改为默认的
\n
(例如句点
或句点加空格)

我这样问是因为这样可以更容易地使用git来管理文档和标记文件等文本文件。我看过一些文章建议人们把每个句子放在自己的行中,这样git就可以把它当作一个单元(而不是一个较长段落的一部分),这很尴尬。这就是问题所在

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

真是个有趣的主意!但是对不起,没有。 我对你的问题投了赞成票,因为我喜欢这个主意。不幸的是,答案是:不,Git不支持这一点

如文件所述,
core.eol
的有效值为
lf
crlf

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

其他相关的git配置设置有
core.safecrlf
core.autocrlf
。我也这么说

为什么git不太可能支持这一点
lf
cf
是具有非常特定含义的控制字符。根据上下文的不同,句点
等常规字符具有多种含义。在许多语言中,它标志着一个句子的结束。但这意味着数字上的不同
..
通常用作省略号,而不是三个句子结尾

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

解决方法:使用git commit
hook
在文本文件中没有句点的每个句点后自动插入
lf
。 这将是一个非常简单的正则表达式

通过尝试这种方法,您将发现以下两点之一:

  • (a) 酷,对我有用!我的文件仍然是普通的文本文件,我的repo仍然是普通的,所以其他人可以使用它

  • (b) 哇,现在我知道他们为什么不支持这个了。真是一团糟

为什么你真的不需要这个 之所以有“文章建议人们将每个句子放在自己的行中”,是因为
git diff
只支持行粒度差异。行差对于代码来说很好,但是对于散文来说很糟糕。插入一个句子,甚至编辑一个单词,都会导致整个段落被标记为已更改,除非该段落被分成几行

但是如果您使用
--word diff[=]
--word diff regex=
--color words[=]
选项,那么
git diff
现在支持字粒度


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

在某些编辑器中可以配置它。将编辑器用作Git的difftool、mergetool和编辑器。您可以创建一个difftool来实现这一点。我有一个C#nuget包,它模仿git的差异处理方式,你必须向它提供以任何对你有意义的方式获得的句子集合。这应该不是很难做到,但若你们想在markdown中处理一些看起来像句子的东西,你们可能需要实现很多markdown语法处理。如果您决定沿着这条路线走下去,并且对difflib有疑问,请随时在这里或旁边向我提问lasse@vkarlsen.noThanks. 你介意演示一下如何实现这个钩子吗?我想我需要两个钩子,一个用于在提交之前添加
lf
,另一个用于在签出之前删除添加的
lf
。我在这里问了一个后续问题。顺便说一下,我假设一个句子结尾的句点后面总是跟一个空格。在这种情况下,我会在中间插入一个
lf