如何查看C语言静态函数实现的Git提交历史?
解决Git Log仅追踪到C静态函数原型的问题
方法1:直接指定函数实现的行范围
如果能定位到函数实现的行区间,直接用行号范围替代函数名即可:
git log -L 起始行号,结束行号:foo.c
要是不确定精确行号,可结合grep先定位实现的起始行(取最后一个匹配项,也就是带函数体的实现头):
git log -L $(grep -n "static.*foo(" foo.c | tail -n1 | cut -d: -f1):+150:foo.c
其中+150表示从起始行往后追踪150行,可根据函数实际长度调整数值。
方法2:自定义Git的C语言函数匹配规则
Git默认的cpp diff驱动会把原型和实现都识别为函数定义,你可以自定义正则,让Git只识别带函数体的实现部分:
- 在仓库根目录的
.git/config中添加以下配置:
[diff "c-impl"] xfuncname = ^static.*[)].*{$
这个正则会匹配以static开头、结尾为){的行(对应函数实现的开头,原型不会带{)。
2. 修改.gitattributes,将C文件的diff驱动替换为自定义的规则:
*.c diff=c-impl
之后再执行git log -L :foo:foo.c,Git就会优先匹配函数实现部分的历史。
方法3:用pickaxe功能追踪独特代码片段
如果函数实现里有独一无二的代码行(比如特定的变量初始化、分支逻辑),可以用pickaxe过滤相关提交:
git log -S"foo_impl_unique_code" foo.c
把foo_impl_unique_code替换为实现里的独有代码,就能精准找到修改过该函数实现的提交。
内容的提问来源于stack exchange,提问作者lluttrell
相关产品推荐
相关产品推荐

