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

Posted

技术标签:

【中文标题】如何使 git-diff 和 git log 忽略新文件和已删除文件?【英文标题】:How to make git-diff and git log ignore new and deleted files? 【发布时间】:2011-10-17 04:24:10 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

我经常使用--diff-filter=M,这将差异输出限制为仅内容修改。

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

【讨论】:

当与git log 一起使用时,这将导致它完全忽略只添加和/或删除文件的提交。 有没有办法实际上只排除一种类型的数据?类似--diff-filter=!D @Kamil 是的,有。引用文档:Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.【参考方案2】:

Official document:

--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

【讨论】:

关于使用小写字母选项排除路径和使用大写字母选项包含路径的注意事项。【参考方案3】:

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

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


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

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

【讨论】:

这没关系,但这样我就失去了仅在需要时使用寻呼机(更少)的可能性,不是吗? @maaartinus:我想是的;我没有想到这一点。 (就我个人而言,我将我的 git 寻呼机设置为“cat”并明确使用... | less。)您可能会查看less-E-F 选项(尽管在我的系统上它不会让我看到输出)。 好的,没关系,但是看看另一个答案。

以上是关于如何使 git-diff 和 git log 忽略新文件和已删除文件?的主要内容,如果未能解决你的问题,请参考以下文章

在提交之间使用 git-diff 忽略 *all* 空格更改

如何让 diff 像 git-diff 一样工作?

在 git-diff 的输出中着色空白

如何使git忽略某些文件或文件夹

项目中使用.gitkeep文件的作用

项目中使用.gitkeep文件的作用