-
胡乱猜测。。。 你试过了吗 git diff--名称状态--文本转换 ? 或者也许 git diff—仅名称 ? – 罗德里戈 评论 2013年5月13日16:55 -
是的,我只使用了名称,但它会返回(如我所说)每个文件,因为每个文件的注释都已更改-- textconv不起作用,因为正如我在帖子中所说,git在没有生成完整diff时会忽略它。 – 贝努比德 评论 2013年5月13日17:04 -
1 的可能副本 忽略git-diff中与字符串匹配的更改 – 里奇夫德 评论 2015年6月23日14:08 -
1 @richvdh我认为这些问题非常相似,可以认为是重复的,但它们有不同的正确答案,而且这个问题有其他问题没有的额外答案,所以我认为保留这两个问题是有价值的。 – 贝努比德 评论 2015年6月23日15:23 -
2 相关:Git 2.30(2021年第1季度)将提议 git diff-I<正则表达式> . – VonC公司 评论 2020年11月9日20:16
8个答案
多行注释版本
git diff-w-G'(^[^\*#/])|(^#\w)|(|s+[^\**#/]
-w个 忽略空白 -G公司 仅显示与以下正则表达式匹配的差异行 (^[^\*# /]) 任何不以星号、散列或空格开头的行 (^#\w) 任何以开头的行 # 后面是一封信 (^\s+[^\*#/]) 以空白开头,后跟注释字符的任何行
a=b /c;
git diff-G<正则表达式>
-G<正则表达式>
查找修补程序文本中包含匹配的添加/删除行的差异
<正则表达式> .
为了说明
-S<正则表达式>--选择正则表达式 和
-G<正则表达式> , 考虑在同一文件中使用以下diff进行提交:
+返回! regexec(regexp,two->ptr,1,®match,0); ... -命中=! regexec(regexp,mf2.ptr,1,®match,0);
While期间
git log-G“regexec\(regexp)” 将显示此承诺,
git log-S“regexec\(regexp)”--选择正则表达式 不会 (因为该字符串的出现次数没有改变)。
请参阅 鹤嘴锄 报关进口 gitdiffcore公司 (7) 了解更多信息。
-G公司 使用基本正则表达式。 不支持 ? , * , ! , { , } 正则表达式语法。 与分组 () OR-ing小组与 | . 通配符,例如 \秒 , \W公司 支持等。 长眼睛和长眼睛是 不 支持。 起点和终点线锚 ^$ 工作。 该功能从Git 1.7.4开始提供。
排除的文件与排除的差异
示例
git diff-G'foo'
git diff-G“^[^#]”
git diff-G`(FIXME)|(TODO)`
-G选项正在使用哪个正则表达式工具?
if(选择&(DIFF_PICKAXE_REGEX | DIFF_PIC KAXE_KIND_G)){ int cflags=REG_EXTENDED | REG_NEWLINE; if(DIFF_OPT_TST(o,PICKAXE_IGNORE_CASE)) cflags |=REG_ICASE; regcomp或die(®ex,指针,cflags); regexp=®ex; //在regcomor_die函数中 regcomp(regex、needle、cflags);
注册_扩展 解释时使用POSIX扩展正则表达式语法 正则表达式。 如果未设置,POSIX基本正则表达式语法为 已使用。
注册_新线 Match-any-character运算符与换行符不匹配。 不包含换行符的非匹配列表([^…])不会 匹配换行符。 匹配行外运算符(^)与空字符串匹配 紧跟在换行符之后,无论是否使用eflags regexec()的执行标志,包含REG_NOTBOL。 匹配行运算符($)匹配空字符串 在换行符之前,无论eflags是否 包含REG_NOTEOL。
git diff--numstat--最小<commit><commit>| sed'/^[1-]\s\+[1-].s\+.*/d'
git diff-w | grep-c-E“(^[+-]\s*(\/)?\*)|(^[+-]\s*\/\/)”
git diff-w--统计
注意以“+”或“-”开头的行,这表示修改后的行。 后面可以有可选的空白字符。” \s*’ 然后查找注释行模式“/*”(或)仅“*”(或者)“//”。 由于grep中提供了“-c”选项,因此只需打印计数即可。 删除“-c”选项以仅在差异中查看注释。
1.)源文件基于C语言。 Makefile和shell脚本文件有一个不同的约定“#”来表示注释行,如果它们是diffset的一部分,则不会计算它们的注释行。 2.)更改行的Git约定:如果修改了一行,Git会将其视为删除了特定行,并在其中插入了一个新行,看起来可能有两行发生了更改,而实际上只有一行发生了修改。 在下面的示例中,“FOO”的新定义看起来像是一个双线更改。 $git差异--stat-w abc.h ... -#定义FOO 7 +#定义FOO 105 ... 1个文件已更改,1个插入(+),1个删除(-) $ 3.)与模式不匹配的有效注释行(或)与模式匹配的有效源代码行可能会导致计算错误。
+ /* +等等 + * + */
+printf(“\n%p”, +*ptr);
#!/ usr/bin/env-python 导入系统 进口再进口 导入配置分析器 从fnmatch导入 从unidiff导入PatchSet EXTS=[“py”] 类Opts:#pylint:disable=too-few-public-methods debug=错误 排除=[] 定义filtered_hunks(fil): path_re=“.*[.](%s)$”%“|”.join(EXTS) 对于PatchSet(fil)中的补丁: 如果不匹配(path_re,path.path): 持续 排除=假 如果Opts.exclude: 如果Opts.debug: 打印(“>”,patch.path,“=~”,Opts.exclude) 对于Opts.exclude中的ex: 如果fnmatch(patch.path,ex): 排除=真 如果排除在外: 持续 对于大块补丁: 屈服块 类类型:#pylint:disable=too-few-public-methods 线路=“.” COMMENT=“#” DOCSTRING=“d” 白色=“w” 定义分类线(fil): 对于filtered_hunks(fil)中的hunk: classify_hunk(hunk)产量 定义分类线(lval): “”“对单个python行进行分类,注意注释、在docstring启动/停止和pure-whitespace中所做的最大努力。”“” lval=lval.rstrip(“\n\r”) remaining_lval=等级 typ=典型。 线路 如果re匹配(r“^*$”,lval): return类型。 白色,无,“” 如果重新匹配(r“^*#”,lval): typ=典型。 评论 remaining_lval=“” 其他: slug=重新匹配(r“^*(\”“\”“|'')(.*)”,等级) 如果段塞: remaining_lval=段塞[2] slug=slug[1] return类型。 DOCSTRING,slug,剩余_值 return typ,无,剩余_lval 定义classify_hunk(hunk): “”“对python diff-hunk的行进行分类,尝试记录注释和文档字符串。 忽略上下文行。 不保证检测到文档字符串(大文档字符串中间的更改不会启动。) 使用AST可以解决这个问题,但这似乎有些过头了,不能在diff-only上完成。 """ p=“” 上一个类型=0 pslug=无 对于大块线条: lval=行值 lval=lval.rstrip(“\n\r”) typ=典型。 线路 naive_typ,slug,remaining_lval=分类线(lval) 如果p和p[-1]==“\\”: typ=上一个类型 其他: 如果prev_typ!= 类型。 DOCSTRING和naive_typ==类型。 备注: 类型=原始类型 elif naive_typ==类型。 文件字符串: 如果prev_typ==类型。 DOCSTRING和pslug==slug: #线的其余部分可能有东西 类型,_,_=分类线(剩余值) 其他: typ=类型。 DOCSTRING公司 pslug=段塞 elif prev_typ==类型。 文件字符串: #continue在此上下文/hunk中找到docstring typ=典型。 DOCSTRING公司 p=等级 prev_typ=典型 如果类型==类型。 文件字符串: 如果重新匹配(r“(%s)*$”%pslug,remaining_lval): prev_typ=类型。 线路 如果line.is_context: 持续 产量类型,lval 定义count_lines(fil): “”“总计更改的python代码行数,试图去除注释和文档字符串。 删除/添加均计算在内。 可能会错过一些事情,不要依赖精确的计数。 """ 计数=0 对于分类行(fil)中的(typ,line): 如果Opts.debug: 打印(典型值,行) 如果类型==类型。 线路: 计数+=1 返回计数 定义main(): ops.debug=sys.argv中的“--debug” Opts.exclude=[] sys.argv中的use_ovrc=“--covrc” 如果use_covrc: config=配置分析器。 配置分析器() 配置读取(“.coveragerc”) cfg={s:dict(config.items(s))for s in config.sections()} exclude=cfg.get(“报告”,{}).get(“省略”,[]) Opts.exclude=[f.strip()用于exclude.split(“\n”)中的f 对于范围内的i(len(sys.argv)): 如果sys.argv[i]==“--排除”: 选项排除追加(sys.argv[i+1]) 如果Opts.debug和Opts.exclude: 打印(“--排除”,选项排除) 打印(count_lines(sys.stdin)) 示例=“” diff—git a/cryptvfs.py b/cryptvs.py 索引c68429cf6..ee90ecea8 100755 ---a/cryptvfs.py(密码) +++b/cryptvfs.py @@ -2,5 +2,17 @@ 从src.main导入proc_entry -如果__name__==“__main__”: -进程条目(_) + + +Foo类: +“”“一些文档字符串 + """ +#一些评论 +通过 + +类栏: +“”“一些文档字符串 + """ +#一些评论 +定义方法(): +第1+1行 ''' 定义strio: 导入io 返回io.StringIO 定义test_basic(): 断言count_lines(strio(示例))==10 定义测试主(capsys): sys.argv=[] sys.stdin=strio(示例) 主() cap=capsys.readuter() 打印(大写) 断言cap.out==“10\n” 定义test_debug(capsys): sys.argv=[“--调试”] sys.stdin=strio(示例) 主() cap=capsys.readuter() 打印(大写) 断言类型。 DOCSTRING+cap.out中的“”“some DOCSTRING” 定义test_exclude(capsys): sys.argv=[“--exclude”,“cryptvfs.py”] sys.stdin=strio(示例) 主() cap=capsys.readuter() 打印(大写) 断言cap.out==“0\n” 定义test_covrc(capsys): sys.argv=[“--covrc”] sys.stdin=strio(示例) 主() cap=capsys.readuter() 打印(大写) 断言cap.out==“10\n” 如果__name__==“__main__”: 主()
#!/ 垃圾桶/垃圾桶 git diff—读取FPATH时仅显示名称“$@”|; 做 LINES_COUNT=`git diff--textconv“$FPATH”“$@”|sed'/^[1-]\s\+[1-]\s\+.*/d'|wc-l` 如果[$LINES_COUNT-gt 0]; 然后 echo-e“$LINES_COUNT\t$FPATH” fi(菲涅耳) 完成|排序-n