在 Git diff 中,我可以排除包含某些字符串的 diff 吗?

问题描述 投票:0回答:3

使用 Git diff,有没有办法排除包含给定字符串的行? (类似地,用

-w
排除仅包含空格的差异。)有时,Git 差异会返回一长串更改,这些更改在给定的开发阶段没有意义。

例如,仅更改UUID的补丁,或仅更改“权重”的补丁。有时这些变化并不显着,但仍然会导致包含很多很多行的差异。

Git 文档似乎提到了接近于通过字符串排除的功能(

git grep
git log -L
)。有什么东西我还没有找到,或者我只是还没有正确使用吗?

git git-diff
3个回答
1
投票

可以设置 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
查看更多相关信息。


1
投票

来自 Git-diff

的文档页面的答案
-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: ' 开头的任何行中的更改。


0
投票

不是我所知道的。

您可以按差异文件的状态 (

--diff-filter=\[(A|C|D|M|R|T|U|X|B)…​\[*\]\]
) 排除差异文件,但不能按其内容排除。

您需要包装 git diff 并对其结果进行后处理,以便按内容进行过滤。

© www.soinside.com 2019 - 2024. All rights reserved.