我对git中受版本控制的大量文件做了一个简单的更改,我希望能够检查没有其他更改正在进入这个大型提交.
这些变化都是形式
- "main()",
+ OOMPH_CURRENT_FUNCTION,
Run Code Online (Sandbox Code Playgroud)
其中"main()"可以是任何函数的名称.我想生成不属于这种形式的所有更改的差异.
git diff的-G和-S选项非常接近 - 它们发现与字符串或正则表达式匹配的更改.
有没有办法做到这一点?
另一个问题描述了如何使用这种方法来否定正则表达式,我认为命令应该是
git diff -G '^((?!OOMPH_CURRENT_FUNCTION).)*$'
Run Code Online (Sandbox Code Playgroud)
但这只是返回错误消息
fatal: invalid log-grep regex: Invalid preceding regular expression
Run Code Online (Sandbox Code Playgroud)
所以我猜git不支持这个正则表达式功能.
我还注意到标准的unix diff有-I选项"忽略其行符合RE的变化".但我找不到用unix diff工具替换git自己的diff的正确方法.
Elm*_*ise 18
请尝试以下方法:
$ git diff > full_diff.txt
$ git diff -G "your pattern" > matching_diff.txt
Run Code Online (Sandbox Code Playgroud)
然后你可以这样比较两个:
$ diff matching_diff.txt full_diff.txt
Run Code Online (Sandbox Code Playgroud)
如果所有更改都与模式匹配,full_diff.txt并且matching_diff.txt将完全相同,则最后一个diff命令将不返回任何内容.
如果存在与模式不匹配的更改,则最后一个diff将突出显示这些更改.
您可以结合上述所有步骤,避免创建两个额外的文件,如下所示:
diff <(git diff -G "your pattern") <(git diff) # works with other diff tools too
Run Code Online (Sandbox Code Playgroud)
Von*_*onC 10
不再需要grep!
在 Git 2.30(2021 年第一季度)中,“ git diff” (man)命令系列学会了“ -I<regex>”选项,以忽略更改行都与给定模式匹配的大块头。
请参阅Micha 的commit 296d4a9、commit ec7967c(2020 年 10 月 20 日)?饼?( kempniu)。
(由Junio C gitsterHamano合并-- --在commit 1ae0949,2020 年 11 月 2 日)
diff: 添加-I<regex>忽略匹配更改签字人:Micha?饼?
添加一个新的 diff 选项,该选项允许忽略所有行(已更改、已删除和已添加)与给定正则表达式匹配的更改。
这类似于独立实用程序中的-I/--ignore-matching-lines选项,diff可用于例如忽略仅影响代码注释的更改或在包含大量自动应用修改(例如树范围的字符串替换)的提交中查找不相关的更改。
-G/-S和新-I选项之间的区别在于后者基于每次更改过滤输出。使用 'ignore' 字段
xdchange_t将更改标记为忽略与否。
由于 使用相同的字段--ignore-blank-lines,因此相同的大块发射规则适用于--ignore-blank-lines和-I。
这两个选项也可以在同一个git调用中一起使用(它们相互补充)。重命名
xdl_mark_ignorable()为xdl_mark_ignorable_lines(),以表明它在逻辑上是 的“兄弟”xdl_mark_ignorable_regex()而不是其“父”。
diff-options现在包括在其手册页中:
-I<regex>
--ignore-matching-lines=<regex>忽略所有行匹配的更改
<regex>。
可以多次指定此选项。
例子:
git diff --ignore-blank-lines -I"ten.*e" -I"^[124-9]"
Run Code Online (Sandbox Code Playgroud)
diff -I<regexp>Git 2.31(2021 年第一季度)已更正“ ”中的一个小内存泄漏。
请参阅Ævar Arnfjörð Bjarmason ( ) 的commit c45dc9c和commit e900d49(2021 年 2 月 11 日)。(由Junio C Hamano合并-- --在提交 45df6c4 中,2021 年 2 月 22 日)avar
gitster
diff: 从 regcomp() 上插入内存泄漏{log,diff} -I签字人:Ævar Arnfjörð Bjarmason
固定在内存泄漏296d4a9(“
diff:添加-I忽略匹配的变化”,二○二○年十月二十○日,GIT中v2.30.0-RC0 -合并中列出批#3)通过释放它分配的存储器中新引入的diff_free()。这种内存泄漏是在296d4a9中有意引入的,请参阅有关它的先前迭代的讨论。
当时释放内存有点乏味,但由于它不再是新引入的
diff_free()让我们使用它。让我们保留模式
diff_free_file()并添加 adiff_free_ignore_regex(),即使(不像"diff_free_file")我们不需要在其他地方调用它。
我认为这将使代码更具可读性,而不是逐渐积累一个巨大的diff_free()函数,int i在不相关的代码之间共享“ ”等。
使用git difftool运行实际diff.
例如:https://github.com/cben/kubernetes-discovery-samples/commit/b1e946434e73d8d1650c887f7d49b46dcbd835a6
我创建运行一个脚本diff我想(在这里我保持的方式curl --verbose输出的回购,导致无聊的每一次改变我重新运行卷曲):
diff --recursive --unified=1 --color \
--ignore-matching-lines=serverAddress \
--ignore-matching-lines='^\* subject:' \
--ignore-matching-lines='^\* start date:' \
--ignore-matching-lines='^\* expire date:' \
--ignore-matching-lines='^\* issuer:' \
--ignore-matching-lines='^< Date:' \
--ignore-matching-lines='^< Content-Length:' \
--ignore-matching-lines='--:--:--' \
--ignore-matching-lines='{ \[[0-9]* bytes data\]' \
"$@"
Run Code Online (Sandbox Code Playgroud)
而现在我可以运行git difftool --dir-diff --extcmd=path/to/above/script.sh并只看到有趣的变化.
关于GNU diff -Iaka的一个重要警告--ignore-matching-lines:这只是阻止这些行创建一个"有趣"的块,但是当这些更改出现在同一块中并且有其他未被忽略的更改时,它仍然会显示它们.我--unified=1上面用了通过减少块来减少这种影响(每次更改上下只有1个上下文行).