如何让git-diff和git log忽略新文件和已删除文件?

xmd2e60i  于 2023-06-20  发布在  Git
关注(0)|答案(4)|浏览(140)

有时会有几个更改的文件以及一些新的,删除和/或重命名的文件。在执行git diffgit-log时,我想省略它们,这样我可以更好地发现修改。
实际上,列出新文件和已删除文件的名称而不列出其内容是最好的。对于“old”重命名为“new”,我想可选地获取“old”和“new”之间的差异。

bfhwhh0e

bfhwhh0e1#

--diff-filter选项可用于diff和log。
我经常使用--diff-filter=M,它将diff输出限制为仅修改内容。
要检测重命名和副本并在diff输出中使用它们,可以分别使用-M-C,以及RC选项到--diff-filter

jobtbby3

jobtbby32#

正式文件:
--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
eqqqjvef

eqqqjvef3#

此外,这些大写字母可以向下转换以排除。
例如,--diff-filter=ad排除了添加和删除的路径。
在您的情况下,git diff --diff-filter=ad可以工作,但请确保不要在同一个过滤器中使用小写字母和大写字母,除非您有Git 2.36(Q2 2022)。
"git diff --diff-filter=aR"(man)现在已正确解析。
参见commit 75408cacommit 4d4d4eacommit d843e31(2022年1月28日)by Johannes Schindelin ( dscho )
(由Junio C Hamano -- gitster --合并于commit 9a16099,2022年2月16日)

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

签字人:约翰内斯·申德林
--diff-filter=<bits>选项允许根据特定条件过滤差异,例如R仅显示重命名的文件。
它还支持通过小写字母否定过滤器,即
r显示 * 除 * 重命名文件之外的所有内容。
然而,当试图弄清楚git diffman)是否应该以所有diff-filter打开开始时,代码有点过于热心,因为用户提供了一个小写字母:如果--diff-filter参数以大写字母开头,则不能以打开所有位开始。
更糟糕的是,可以在多个单独的选项中指定diff过滤器,例如--diff-filter=AM [...] --diff-filter=m.
让我们独立地累积包含/排除过滤器,并且在完全解析选项之后仅特殊情况“仅指定排除过滤器”。

kjthegm6

kjthegm64#

***更新:***Charles Bailey的accepted answer是正确的;所需的功能已经内置到git中。

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

git diff通过与/dev/null进行比较来显示新文件和已删除文件。编写查找/dev/null并过滤掉以下行直到下一个diff的代码应该不会太难(我自己会使用Perl)。然后是git diff ... | the-filter
重命名的文件是另一回事;对此我还没有一个好的答案。

相关问题