git diff
或者 git-log
命令时,我希望能够排除它们,这样我就可以更好地发现修改了哪些内容。实际上,最好只列出新文件和删除文件的名称而不包括它们的内容。对于那些从“旧名称”改名为“新名称”的文件,我希望可以选择性地获取“旧名称”和“新名称”之间的差异。
--diff-filter
选项适用于diff
和日志。
我经常使用--diff-filter=M
,该选项将diff输出限制为仅内容修改。
要检测重命名和复制并在diff输出中使用它们,您可以分别使用-M
和-C
,并与--diff-filter
选项的R
和C
选项一起使用。
官方文档:
--diff-filter=[(A|C|D|M|R|T|U|X|B)…[*]]
只选择已添加(A)、已复制(C)、已删除(D)、已修改(M)、已重命名(R)、类型更改(即常规文件、符号链接、子模块等)(T)、未合并(U)、未知(X)或已破坏配对(B)的文件。 可以使用任意组合的过滤字符(包括无)。
当将 *(全部或无)添加到组合中时,如果比较中存在与其他条件匹配的文件,则选择所有路径;如果没有与其他条件匹配的文件,则不选择任何内容。
此外,这些大写字母可以转换为小写以进行排除。例如,--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) 现在被正确解析。
请查看提交75408ca, 提交4d4d4ea, 提交d843e31 (2022年1月28日) 由Johannes Schindelin (dscho
)完成。
(由Junio C Hamano -- gitster
--合并于提交9a16099, 2022年2月16日)
diff-filter
: 在查找负位时更加小心Signed-off-by: Johannes Schindelin
--diff-filter=<bits>
选项允许按照某些标准过滤差异,例如R
仅显示重命名的文件。
它还支持通过小写字母否定过滤器,即
r
显示除了重命名文件之外的所有内容。然而,当尝试确定
git diff
(man)是否应该从所有差异过滤器开始时,代码有点过于热心,因为用户提供了一个小写字母:如果--diff-filter
参数以大写字母开头,我们不能从所有位开始。更糟糕的是,可以在多个单独的选项中指定差异过滤器,例如
--diff-filter=AM [...] --diff-filter=m
。让我们独立累积包含/排除过滤器,并仅在解析所有选项后特殊处理“仅指定排除过滤器”的情况。
更新:Charles Bailey的被接受的答案是正确的,所需功能已经内置于git中。
我将保留此答案,因为它可能为未内置于git中的功能提供思路。
git diff
通过将文件与 /dev/null
进行比较来显示新文件和已删除的文件。编写一些东西(我会使用 Perl)查找 /dev/null
并过滤出以下行,直到下一个差异,这应该不太难。然后使用 git diff ... | the-filter
。
重命名的文件是另一回事;对此我还没有一个好的答案。
... | less
。)您可以查看less
的-E
或-F
选项(尽管在我的系统上它不允许我查看输出)。 - Keith Thompson
git log
一起使用时,这将使其完全忽略仅添加和/或删除文件的提交。 - qqx