git-diff如何生成hunk描述?

16

(git版本1.6.5.7)

当我运行git diff时,输出的Python脚本行号后有一个很好的范围提示,例如:

diff --git a/file.py b/file.py
index 024f5bb..c3b5c56 100644
--- a/file.py
+++ b/file.py
@@ -14,6 +14,8 @@ TITF: Test Infrastructure Tags Format
...
@@ -1507,13 +1533,16 @@ class Tags( object ):
...

请注意行号后面跟随着TITF: 测试基础设施标签格式class Tags( object ):。第一个补丁适用于模块作用域,TITF: 测试基础设施标签格式是该模块的描述。第二个补丁适用于 Tags 类的一个方法。

  1. Git 是如何生成这些描述的?
  2. 我如何调整它们以显示补丁所应用的方法名称?
2个回答

16

Git 使用正则表达式来查找适合 hunk headers 的行。Python 自带的正则表达式,但你应该能够在你的 ~/.gitconfig 中定义自己的表达式:

[diff "python"]
        xfuncname = "<regex goes here>"

更多关于此的信息,请点击此处

编辑:内置的Python正则表达式似乎在userdiff.c(第53行)中定义,尽管我的正则表达式技巧不足以确切理解其具体功能...

PATTERNS("python", "^[ \t]*((class|def)[ \t].*)$",
         /* -- */
         "[a-zA-Z_][a-zA-Z0-9_]*"
         "|[-+0-9.e]+[jJlL]?|0[xX]?[0-9a-fA-F]+[lL]?"
         "|[-+*/<>%&^|=!]=|//=?|<<=?|>>=?|\\*\\*=?"
         "|[^[:space:]|[\x80-\xff]+"),
         /* -- */

有趣的是,将".py diff=python"更改为我想要的行为,甚至无需定义自定义的[diff "python"]。但是".py +diff"(显然是我的默认设置)的行为如同我在问题中所示。 - RobM
1
".py diff=python" 告诉 Git 使用在 [diff "python"] 下定义的选项(或预定义的默认选项),".py +diff" 则仅启用文本差异。这个开关通常用于禁用那些不总是被检测为二进制文件的文件的差异,例如 "*.ps -diff" 将把 PostScript 文件视为二进制文件,因此不会显示差异。 - DataWraith
虽然对于二进制文件而言,建议设置"*.ps binary",它是"-crlf -diff"的别名,即它也禁用了文件的CRLF <-> LF处理。 - araqnid
2
GNU diff有类似的-p / --show-c-function选项,这启发了它的git-diff等效/泛化。 - Jakub Narębski
2
对于那些想知道“*.py diff=python”是什么的人,我想提一下,这是一个.gitattributes文件中的一行(如果我没记错的话)。 - Eric O. Lebigot

1

在Git 2.25(2020年第一季度)中,userdiff机制已经学会了"async def"是Python中开始"function"的另一种方式。

请参见提交077a1fd(由Josh Holland(anowlcalledjosh)于2019年11月19日提交)。
(由Junio C Hamano -- gitster --提交9502b61中合并,2019年12月5日)

userdiff: 支持Python异步函数

签署者:Josh Holland
确认者:Johannes Sixt

Python的async函数(使用"async def"声明而不是"def")未在块标题中显示。
此提交使Git了解async函数语法,并为Python userdiff正则表达式添加了测试。


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