“git diff --word-diff” 的默认正则表达式是什么?

6
“git diff”有一个选项“--word-diff-regex=<...>”,可以匹配单词。对于某些语言,有一些特殊的默认值(如在“man 5 gitattributes”中所述)。但是这些是什么?文档中没有说明。我查看了“git”的源代码,也没有找到它们。
有什么想法吗?
编辑:我使用的是“git 1.9.1”,但我接受任何版本的答案。
3个回答

8

这些源代码包含在userdiff.c文件中的默认单词正则表达式。 PATTERNSIPATTERN 宏将基本单词正则表达式作为其第三个参数,并添加"|[^[:space:]]|[\xc0-\xff][\x80-\xbf]+"以确保所有不是更大的单词的非空格字符被视为单独的单词,假设使用UTF-8编码,而不会分隔多字节字符。例如,在:

PATTERNS("tex", "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$",
         "\\\\[a-zA-Z@]+|\\\\.|[a-zA-Z0-9\x80-\xff]+"),

正则表达式(regex)的含义是"\\\\[a-zA-Z@]+|\\\\.|[a-zA-Z0-9\x80-\xff]+|[^[:space:]]|[\xc0-\xff][\x80-\xbf]+"

在这种情况下,|[\xc0-\xff][\x80-\xbf]+并没有任何好处,因为[\xc0-\xff][\x80-\xbf]+所覆盖的所有内容都已经被[a-zA-Z0-9\x80-\xff]+所覆盖,但它也不会造成任何损害。


1
在git版本2.8.3上,$ git diff --word-diff-regex="\\[a-zA-Z@]+|\\.|[a-zA-Z0-9\x80-\xff]+|[^[:space:]]|[\xc0-\xff][\x80-\xbf]+"和git diff --word-diff产生了类似但不同的结果。 - Jason Pyeron

2
.gitattributes文档中提供了一系列预定义的diff驱动程序(它们都有预定义的单词diff正则表达式)。进一步指出:

您仍需要通过属性机制启用此功能,即通过.gitattributes文件。

因此,要激活hvd答案中显示的tex模式以处理所有*.tex文件,您可以在项目根目录下执行以下命令(在Windows下省略引号):
echo '*.tex diff=tex' >> .gitattributes

1
注意:关于那些模式,Git 2.34(2021年第四季度)更加明确并提醒开发人员应保持userdiff模式简单和宽容,假设它们应用的内容始终是语法正确的。
请参见提交 b6029b3(2021年8月10日),由Junio C Hamano (gitster)进行。
(由Junio C Hamano -- gitster --提交 e1eb133中合并,2021年8月30日)

userdiff: 对内置模式的评论

提醒开发人员,他们不需要过度实现模式以准备处理无效结构。
他们只需要足够宽容,假设有效载荷在语法上是正确的,这可能使它们更简单。

大部分文本被 Johannes Sixt 偷走,并进一步改进。

因此,这些内置模式现在有一个注释:

/*
 * Built-in drivers for various languages, sorted by their names
 * (except that the "default" is left at the end).
 *
 * When writing or updating patterns, assume that the contents these
 * patterns are applied to are syntactically correct.  The patterns
 * can be simple without implementing all syntactical corner cases, as
 * long as they are sufficiently permissive.
 */
static struct userdiff_driver builtin_drivers[] = {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接