忽略与git diff中的字符串匹配的更改

时间:2013-04-08 12:06:21

标签: regex git diff

我对git中受版本控制的大量文件做了一个简单的更改,我希望能够检查没有其他更改正在进入这个大型提交。

所有形式的变化都是

-                       "main()",
+                       OOMPH_CURRENT_FUNCTION,

其中“main()”可以是任何函数的名称。我想生成一个不属于这种形式的所有变化的差异。

git diff的-G和-S选项非常接近 - 它们发现与字符串或正则表达式匹配的更改。

有没有好办法呢?

到目前为止的尝试

另一个question描述了如何否定正则表达式,使用这种方法我认为命令应该是

git diff -G '^((?!OOMPH_CURRENT_FUNCTION).)*$'

但这只是返回错误消息

fatal: invalid log-grep regex: Invalid preceding regular expression

所以我猜git不支持这个正则表达式功能。

我还注意到标准的unix diff有-I选项“忽略其行匹配RE的更改”。但我找不到用unix diff工具替换git自己的diff的正确方法。

4 个答案:

答案 0 :(得分:16)

尝试以下方法:

$ git diff > full_diff.txt
$ git diff -G "your pattern" > matching_diff.txt

然后你可以比较两者:

$ diff matching_diff.txt full_diff.txt

如果所有更改都与模式匹配,full_diff.txtmatching_diff.txt将完全相同,最后diff命令将不会返回任何内容。

如果有与模式不匹配的更改,则最后一个diff将突出显示这些更改。


您可以结合上述所有步骤,避免创建两个额外的文件,如下所示:

diff <(git diff -G "your pattern") <(git diff)  # works with other diff tools too

答案 1 :(得分:5)

使用git difftool来运行真实的diff

示例:https://github.com/cben/kubernetes-discovery-samples/commit/b1e946434e73d8d1650c887f7d49b46dcbd835a6
我创建了一个脚本,以自己想要的方式运行diff(在这里,我将curl --verbose的输出保存在仓库中,每次重新运行curl都会导致无聊的更改):

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\]' \
     "$@"

现在我可以运行git difftool --dir-diff --extcmd=path/to/above/script.sh并只看到有趣的更改。

关于GNU diff -I--ignore-matching-lines的一个重要警告:这仅仅是防止这样的行使一个块“相互干扰”,但是当这些更改与其他不可忽略的更改出现在同一块中时,它将仍然给他们看。我在上面使用了--unified=1,通过减小块的大小来减小这种影响(每次更改上下仅1个上下文行)。

答案 2 :(得分:2)

不需要更多grep!

在Git 2.30(2021年第一季度)中,“ git diffman系列命令学习了“ -I<regex> “选项,以忽略更改后的行都与给定模式匹配的块。

请参见commit 296d4a9commit ec7967cMichał Kępień (kempniu)(2020年10月20日)。
(由Junio C Hamano -- gitster --commit 1ae0949中合并,2020年11月2日)

diff:添加-I<regex>忽略匹配的更改

签名人:MichałKępień

添加一个新的diff选项,该选项可以忽略所有行(已更改,已删除和已添加)都匹配给定正则表达式的更改。
这类似于独立的-I实用程序中的--ignore-matching-lines / diff选项,例如忽略仅影响代码注释的更改,或在包含大量自动应用的修改(例如,树状字符串替换)的提交中查找不相关的更改。

-G / -S与新的-I选项之间的区别在于,后者根据每个更改对输出进行过滤。

使用xdchange_t的'ignore'字段将更改标记为是否忽略。
由于--ignore-blank-lines使用相同的字段,因此相同的块发出规则适用于--ignore-blank-lines-I
这两个选项也可以在同一git调用中一起使用(它们是互补的)。

xdl_mark_ignorable()重命名为xdl_mark_ignorable_lines(),以表示它在逻辑上是xdl_mark_ignorable_regex()的“同级”,而不是其“父级”。

diff-options现在包含在其man page中:

-I<regex>

--ignore-matching-lines=<regex>

忽略所有行都与<regex>匹配的更改。
可以多次指定此选项。

Examples

git diff --ignore-blank-lines -I"ten.*e" -I"^[124-9]"

答案 3 :(得分:0)

我认为使用管道和import React from 'react'; import './App.css'; import { Car } from './Models/Car'; export default class CarTable extends React.Component<any, any> { constructor(props: any) { super(props); this.state = { cars: [], columnOrder: [] } } componentWillMount(){ this.setState({ cars: this.props.cars, columnOrder: this.props.order }); console.log("In CarTable.tsx, component did mount"); console.log(this.state.columnOrder); } render() { return( <table id="carsTable"> <thead> <tr> {this.state.columnOrder.map((column: string, key: any) => { console.log("in header...") console.log({column}); return(<th key={column}>{column}</th>) })} </tr> </thead> <tbody> {this.state.cars.map((car: Car, key: any) => { return( <tr key={key}> <td key={car.Make}>{car.Make}</td> <td key={car.Model}>{car.Model}</td> <td key={car.Year}>{car.Year}</td> </tr> ) })} </tbody> </table> ) } } 有一个不同的解决方案。我有两个文件需要检查以查找不包含grep@@的差异,因此我做到了(从herehere和{{3 }}:

g:

这似乎可以解决问题。颜色仍然在那里。

因此,我假设您可以采用更简单的$ git diff -U0 --color-words --no-index file1.tex file2.tex | grep -v -e "@@" -e "g:" 命令/输出并执行相同的操作。我喜欢它的原因是它不需要制作新文件或重定向(除了管道)。