git-diff如何生成块描述?

16 投票
2 回答
2561 浏览
提问于 2025-04-15 22:26

(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 个回答

1

在Git 2.25版本(2020年第一季度)中,userdiff功能被更新了,现在它知道"async def"也是在Python中定义一个“函数”的另一种方式。

你可以查看这个提交记录077a1fd(2019年11月19日),作者是Josh Holland (anowlcalledjosh
(这个更新由Junio C Hamano -- gitster --合并到提交记录9502b61,日期是2019年12月5日)

userdiff: 支持Python的异步函数

签名:Josh Holland
确认:Johannes Sixt

Python的async函数(用"async def"而不是"def"来声明)之前在代码块的头部是看不到的。
这个提交让Git了解了async函数的语法,并为Python的userdiff正则表达式添加了测试。

16

Git使用正则表达式来找到合适的行作为变更块的标题。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]+"),
         /* -- */

撰写回答