如何使git diff忽略注释

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)

-Ggit中的文档似乎也很缺乏,所以这里的信息应该有所帮助:

git diff -G<regex>

-G<regex>

查找补丁文本包含匹配的添加/删除行的差异<regex>.

为了说明之间的区别-S<regex> --pickaxe-regex-G<regex>,
考虑在同一个文件中的以下DIFF提交:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);
Run Code Online (Sandbox Code Playgroud)

虽然git log -G"regexec\(regexp"会显示此提交,但
git log -S"regexec\(regexp" --pickaxe-regex不会
(因为该字符串的出现次数没有改变).

入门gitdiffcore(7)了解更多信息.

(注意,在Git v2.7.0上测试过)

  • -G 使用基本的正则表达式.
  • 对于不支持?,*,!,{,}正则表达式的语法.
  • 使用()和OR-ing组进行分组可以使用|.
  • 通配符如\s,\W等的支持.
  • 支持前瞻和后视.
  • 开始和结束线锚^$工作.
  • 功能自Git 1.7.4开始提供.

排除的文件v排除的Diffs

请注意,该-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

更新:-G选项正在使用哪个正则表达式工具?

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(&regex, needle, cflags);
    regexp = &regex;

// 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)

希望能帮助大家.


rie*_*sch 7

git diff -G <regex>
Run Code Online (Sandbox Code Playgroud)

并指定与版本号行不匹配的正则表达式.


ric*_*vdh 7

我发现最简单的方法是使用它git difftool来启动外部差异:

git difftool -y -x "diff -I '<regex>'"
Run Code Online (Sandbox Code Playgroud)