我正在尝试生成在特定提交中更改的文件的列表。问题是,每个文件的版本号都在文件顶部的注解中--因为这个提交引入了一个新的版本,这意味着 * 每个文件都发生了变化 。
我不关心修改的注解,所以我想让git diff
忽略所有匹配^\s*\*.*$
的行,因为这些都是注解(/ */的一部分)。
我找不到任何方法来告诉git diff
忽略特定的行。
我已经尝试过设置一个textconv属性,让Git在区分文件之前先把文件传递给sed,这样sed就可以去掉那些有问题的行--这个问题是git diff --name-status
实际上并不区分文件,只是比较散列,当然所有的散列都改变了。
有办法做到这一点吗?
8条答案
按热度按时间nom7f22z1#
这里有一个解决方案,对我来说效果很好。我已经写了解决方案和一些关于
git (log|diff) -G<regex>
选项的其他文档。它基本上使用了与前面的答案相同的解决方案,但特别是针对以
*
或#
开头的注解,有时在*
之前有空格。..但是它仍然需要允许#ifdef
、#include
等。变化。-G
选项似乎不支持向前看和向后看,?
一般也不支持,我在使用*
时也遇到过问题。+
似乎工作得很好。(Note,在Git v2上测试。7.0)
多行注解版本
-w
忽略空白-G
仅显示与以下正则表达式匹配的差异行(^[^\*# /])
任何不以星号、散列或空格开头的行(^#\w)
以#
开头的任何行,后面跟着字母(^\s+[^\*#/])
任何以空格开头,后跟注解字符的行基本上,SVN钩子现在修改每个文件的进出,并修改每个文件上的多行注解块。现在,我可以将我的更改与SVN进行比较,而不需要SVN在注解中丢弃的FYI信息。
从技术上讲,这将允许Python和Bash注解(如
#TODO
)显示在diff中,如果除法运算符在C++中的新行开始,则可以忽略:另外,Git中关于
-G
的文档似乎非常缺乏,所以这里的信息应该有所帮助:git diff -G<regex>
-G<regex>
查找修补程序文本包含与
<regex>
匹配的添加/删除行的差异。为了说明
-S<regex> --pickaxe-regex
和-G<regex>
之间的区别,考虑在同一个文件中具有以下差异的提交:虽然
git log -G"regexec\(regexp"
将显示此提交,但git log -S"regexec\(regexp" --pickaxe-regex
不会(因为该字符串的出现次数没有改变)。有关详细信息,请参阅gitdiffcore(7)中的 pickaxe 条目。
(Note,在Git v2上测试。7.0)
-G
使用基本正则表达式。?
、*
、!
、{
、}
正则表达式语法。()
进行分组,使用|
进行OR分组。\s
、\W
等。得到支持。*不支持前看和后看。
^$
工作。排除的文件与排除的差异
请注意,
-G
选项会过滤将被区分的文件。但是如果一个文件被“diffed”,那么之前被“excluded/included”的那些行将在diff中显示 all。
示例
仅显示至少有一行提到
foo
的文件差异。显示除以
#
开头的行之外的所有文件差异显示在提到
FIXME
或TODO
时存在差异的文件另请参见
git log -G
、git grep
、git log -S
、--pickaxe-regex
和--pickaxe-all
UPDATE:-G选项使用了哪个正则表达式工具?
https://github.com/git/git/search?utf8=%E2%9C%93&q=regcomp&type=
https://github.com/git/git/blob/master/diffcore-pickaxe.c
http://man7.org/linux/man-pages/man3/regexec.3.html
//我的朋友
n3ipq98p2#
并指定一个与您的版本号行不匹配的正则表达式。
szqfcxe23#
我发现使用
git difftool
启动外部diff工具是最简单的:hfwmuf9z4#
我找到解决办法了我可以使用这个命令:
来显示在提交之间有多行更改的文件,这消除了那些唯一更改的是注解中的版本号的文件。
nxowjjhe5#
在'git diff'输出中使用'grep',
可以单独计算注解行改变。(A)
使用'git diff --stat'输出,
可以计算所有的线变化。(B)
要获得无注解源行更改(NCSL)计数,请从(B)中减去(A)。
说明:
在'git diff '输出中(忽略空格更改),
**注意:**由于以下假设,注解行数可能会有小错误,结果应视为大致数字。
在下面的示例中,不以'*'开头的“+ blah blah”行不会被检测为注解行。
在下面的示例中,“+ *ptr”行将被视为注解行,因为它以 * 开头,尽管它是一个有效的源代码行。
wribegjk6#
对于大多数语言,要正确执行,必须解析原始源文件/ast,并以这种方式排除注解。
一个原因是多行注解的开头可能不包括在diff中。另一个原因是,语言解析并不简单,经常有一些事情会让一个简单的解析器出错。
我打算为python做这件事,但字符串黑客已经足够满足我的需要了。
对于python,你可以使用自定义过滤器忽略注解和尝试忽略文档字符串,比如:
That code可以被简单地修改以产生文件名,而不是计数。
但是,当然,它可能会错误地将文档字符串的一部分算作“代码”(这不是为了覆盖率等)。
cgvd09ve7#
比如这样的Bash脚本:
uidvcgyl8#
我使用meld作为工具,通过设置其选项来忽略注解,然后使用meld作为difftool: