如何使git-diff和git日志忽略新建和删除的文件?

有时会有一些更改过的文件以及一些新的、删除的和/或重命名的文件。在执行git diffgit-log时,我想省略它们,以便更好地发现修改。

实际上,列出新文件和删除文件的名称而不列出它们的内容是最好的。对于“旧”重命名为“新”,我想选择获得“旧”和“新”之间的差异。

41077 次浏览

Charles Bailey的< em >更新:是正确的;所需的功能已经内置到git中

我将把这个答案留在这里,因为它可能为git中没有内置的东西提供一些想法。


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

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

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

我经常使用--diff-filter=M,它将diff输出限制为仅对内容进行修改。

要检测重命名和复制并在diff输出中使用它们,您可以分别使用-M-C,以及RC选项来--diff-filter

官方文件:

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

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

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

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

示例:只显示添加、修改、修改的文件,不显示删除的文件:

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

在你的情况下,git diff --diff-filter=ad可以工作,但请确保不要在同一个过滤器中使用小写字母和大写字母,除非你有Git 2.36 (Q2 2022)。

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

参见提交75408 ca提交4 d4d4ea提交d843e31 (28 Jan 2022) by 约翰内斯·辛德林(dscho)
(由Junio C Hamano—gitster提交9 a16099中合并,16 Feb 2022)

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

署名:Johannes Schindelin

--diff-filter=<bits>选项允许根据某些条件过滤差异,例如R只显示重命名的文件。
它还支持通过小写字母对过滤器求反,即

. r显示除了重命名文件

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

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

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