Ben*_*ird 23 git diff git-diff
我正在尝试生成在特定提交中更改的文件的列表.问题是,每个文件在文件顶部的注释中都有版本号 - 并且由于此提交引入了新版本,这意味着每个文件都已更改.
我不关心更改的注释,所以我想让git diff忽略所有匹配的行^\s*\*.*$
,因为这些都是注释(/**/的一部分).
我找不到任何方法来告诉git diff忽略特定的行.
我已经尝试设置一个textconv属性,使git在传播文件之前将文件传递给sed,这样sed可以去掉有问题的线 - 这个问题就是git diff --name-status实际上并不是文件,只是比较哈希值,当然所有哈希值都已更改.
有没有办法做到这一点?
phy*_*att 14
这是一个适合我的解决方案.我已经写了解决方案和一些关于该git (log|diff) -G<regex>
选项的其他缺失文档.
基本上使用相同的解决方案如上,但是专门为以a开头的意见*
或#
,有时一个空格前的*
...但它仍然需要允许#ifdef
,#include
等变化.
向前看并向后看似乎没有-G
选项支持?
,一般情况下也没有,我也有使用问题*
. +
但是,似乎运作良好.
(注意,在Git v2.7.0上测试过)
git diff -w -G'(^[^\*# /])|(^#\w)|(^\s+[^\*#/])'
Run Code Online (Sandbox Code Playgroud)
-w
忽略空格 -G
仅显示与以下正则表达式匹配的diff行(^[^\*# /])
任何不以星号或散列或空格开头的行(^#\w)
任何#
以字母开头的行(^\s+[^\*#/])
任何以空格开头后跟注释字符的行基本上,svn钩子现在修改进出的每个文件,并修改每个文件上的多行注释块.现在我可以在没有svn在评论中删除的fyi信息的情况下对svn进行更改.
从技术上讲,这将允许#TODO
在diff中显示python和bash注释,如果一个除法运算符在c ++中的新行上启动,则可以忽略它:
a = b
/ c;
Run Code Online (Sandbox Code Playgroud)
-G
git中的文档似乎也很缺乏,所以这里的信息应该有所帮助:
git diff -G<regex>
-G<regex>
查找补丁文本包含匹配的添加/删除行的差异
<regex>
.为了说明之间的区别
-S<regex> --pickaxe-regex
和-G<regex>
,
考虑在同一个文件中的以下DIFF提交:Run Code Online (Sandbox Code Playgroud)+ return !regexec(regexp, two->ptr, 1, ®match, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, ®match, 0);
虽然
git log -G"regexec\(regexp"
会显示此提交,但
git log -S"regexec\(regexp" --pickaxe-regex
不会
(因为该字符串的出现次数没有改变).见镐入门gitdiffcore(7)了解更多信息.
(注意,在Git v2.7.0上测试过)
-G
使用基本的正则表达式.?
,*
,!
,{
,}
正则表达式的语法.()
和OR-ing组进行分组可以使用|
.\s
,\W
等的支持.^$
工作.请注意,该-G
选项会过滤要分散的文件.
但是如果一个文件"差异化"那些之前被"排除/包含"的行将全部显示在差异中.
仅显示至少提及一行的文件差异foo
.
git diff -G'foo'
Run Code Online (Sandbox Code Playgroud)
显示除以a开头的行之外的所有内容的文件差异 #
git diff -G'^[^#]'
Run Code Online (Sandbox Code Playgroud)
显示有差异的文件FIXME
或提及TODO
git diff -G`(FIXME)|(TODO)`
Run Code Online (Sandbox Code Playgroud)
又见git log -G
,git grep
,git log -S
,--pickaxe-regex
,--pickaxe-all
https://github.com/git/git/search?utf8=%E2%9C%93&q=regcomp&type=
https://github.com/git/git/blob/master/diffcore-pickaxe.c
if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) {
int cflags = REG_EXTENDED | REG_NEWLINE;
if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
cflags |= REG_ICASE;
regcomp_or_die(®ex, needle, cflags);
regexp = ®ex;
// and in the regcom_or_die function
regcomp(regex, needle, cflags);
Run Code Online (Sandbox Code Playgroud)
http://man7.org/linux/man-pages/man3/regexec.3.html
REG_EXTENDED
Use POSIX Extended Regular Expression syntax when interpreting
regex. If not set, POSIX Basic Regular Expression syntax is
used.
Run Code Online (Sandbox Code Playgroud)
// ...
REG_NEWLINE
Match-any-character operators don't match a newline.
A nonmatching list ([^...]) not containing a newline does not
match a newline.
Match-beginning-of-line operator (^) matches the empty string
immediately after a newline, regardless of whether eflags, the
execution flags of regexec(), contains REG_NOTBOL.
Match-end-of-line operator ($) matches the empty string
immediately before a newline, regardless of whether eflags
contains REG_NOTEOL.
Run Code Online (Sandbox Code Playgroud)
希望能帮助大家.
我发现最简单的方法是使用它git difftool
来启动外部差异:
git difftool -y -x "diff -I '<regex>'"
Run Code Online (Sandbox Code Playgroud)