我对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的正确方法。
答案 0 :(得分:16)
尝试以下方法:
$ git diff > full_diff.txt
$ git diff -G "your pattern" > matching_diff.txt
然后你可以比较两者:
$ diff matching_diff.txt full_diff.txt
如果所有更改都与模式匹配,full_diff.txt
和matching_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 diff
” (man)系列命令学习了“ -I<regex>
“选项,以忽略更改后的行都与给定模式匹配的块。
请参见commit 296d4a9的commit ec7967c,Michał 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>
匹配的更改。
可以多次指定此选项。
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
和@@
的差异,因此我做到了(从here和here和{{3 }}:
g:
这似乎可以解决问题。颜色仍然在那里。
因此,我假设您可以采用更简单的$ git diff -U0 --color-words --no-index file1.tex file2.tex | grep -v -e "@@" -e "g:"
命令/输出并执行相同的操作。我喜欢它的原因是它不需要制作新文件或重定向(除了管道)。