193

有时会有几个更改的文件以及一些新的、已删除和/或重命名的文件。当做git diffgit-log我想省略它们时,我可以更好地发现修改。

实际上,最好列出不包含内容的新文件和已删除文件的名称。对于重命名为“新”的“旧”,我想选择区分“旧”和“新”。

4

4 回答 4

264

--diff-filter选项同时适用于diff和日志。

我使用--diff-filter=M了很多将差异输出限制为仅内容修改的方法。

要检测重命名和副本并在 diff 输出中使用它们,您可以分别使用-M和以及 和选项。-CRC--diff-filter

于 2011-08-01T09:49:17.087 回答
96

官方文件

--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

仅选择已添加 (A)、已复制 (C)、已删除 (D)、已修改 (M)、已重命名 (R) 的文件,其类型(即常规文件、符号链接、子模块……)已更改 (T),未合并 (U)、未知 (X) 或配对已损坏 (B)。可以使用过滤字符的任意组合(包括无)。

在组合中添加 *(All-or-none)时,如果有任何文件与比较中的其他条件匹配,则选择所有路径;如果没有符合其他条件的文件,则不选择任何内容。

此外,这些大写字母可以小写以排除。例如 --diff-filter=ad 排除添加和删除的路径。

示例:仅显示已添加、已更改、已修改的文件,不包括已删除的文件:

git diff --diff-filter=ACM
于 2017-01-18T21:57:18.347 回答
0

此外,这些大写字母可以小写以排除。
例如--diff-filter=ad,排除添加和删除的路径。

在您的情况下,git diff --diff-filter=ad可以使用,但请确保不要在同一过滤器中使用大小写字母,除非您拥有 Git 2.36(2022 年第二季度)。

" git diff --diff-filter=aR" ( man )现在已正确解析。

请参阅Johannes Schindelin ( ) 的commit 75408cacommit 4d4d4eacommit d843e31(2022 年 1 月 28 日(由Junio C Hamano 合并 -- --提交 9a16099中,2022 年 2 月 16 日)dscho
gitster

diff-filter: 查找负位时要更加小心

签字人:约翰内斯·辛德林

--diff-filter=<bits>选项允许按某些标准过滤差异,例如R仅显示重命名的文件。
它还支持通过小写字母否定过滤器,即
r显示重命名文件之外的所有内容。

然而,当试图弄清楚man是否应该以所有差异过滤器打开时,代码有点过分热心,因为用户提供了一个小写字母:如果参数以大写字母开头,我们不能从打开所有位开始。git diff--diff-filter

更糟糕的是,可以在多个单独的选项中指定差异过滤器,例如--diff-filter=AM [...] --diff-filter=m.

让我们独立地累积包含/排除过滤器,并且在完全解析选项后,只有“仅指定排除过滤器”的特殊情况。

于 2022-02-19T23:30:09.500 回答
-3

更新:查尔斯·贝利接受的答案是正确的;所需的功能已经内置到 git 中。

我将把这个答案留在这里,因为它可能会为 git 未内置的东西提供想法。


git diff通过比较它们来显示新的和删除的文件/dev/null/dev/null编写一些东西(我自己会使用 Perl)来查找并过滤出以下几行直到下一个差异应该不会太难。然后git diff ... | the-filter

重命名的文件是另一回事;我(还)没有很好的答案。

于 2011-08-01T05:14:27.997 回答