使用 Git diff,有没有办法排除包含给定字符串的行? (类似地,用
-w
排除仅包含空格的差异。)有时,Git 差异会返回一长串更改,这些更改在给定的开发阶段没有意义。
例如,仅更改UUID的补丁,或仅更改“权重”的补丁。有时这些变化并不显着,但仍然会导致包含很多很多行的差异。
Git 文档似乎提到了接近于通过字符串排除的功能(
git grep
和 git log -L
)。有什么东西我还没有找到,或者我只是还没有正确使用吗?
可以设置 diff textconv 过滤器来调整 diff 输出。如果您编辑 .git/info/attributes 文件(如果不存在则创建它),您可以输入一行 *.c diff=uuid,这将使所有 C 文件使用“uuid”diff 过滤器。您还可以将其写入 .gitattributes 或任何其他有效的 gitattributes 文件中(有关详细信息,请参阅手册页)。
完成此操作后,您可以在 .git/config 文件或个人 .gitconfig 文件中指定 diff 过滤器。指定如何修改文件以呈现差异。例如,你可以这样写:
[diff "uuid"]
textconv = "perl -pe 's/[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}/UUID-PLACEHOLDER/'"
这将使 perl 修改所有差异以将 UUID 转换为
UUID-PLACEHOLDER
。您可以对文件执行任意转换,以便根据需要修改它们以进行差异输出。您可以通过运行 man gitattributes
查看更多相关信息。
-I<regex>
--ignore-matching-lines=<regex>
Ignore changes whose all lines match <regex>. This option may be specified more than once.
git diff -I"^uuid: " -- config/sync
将返回一个简洁列表,忽略以 'uuid: ' 开头的任何行中的更改。
不是我所知道的。
--diff-filter=\[(A|C|D|M|R|T|U|X|B)…\[*\]\]
) 排除差异文件,但不能按其内容排除。
您需要包装 git diff 并对其结果进行后处理,以便按内容进行过滤。