【发布时间】:2011-10-17 04:24:10
【问题描述】:
有时会有一些更改的文件以及一些新的、已删除和/或重命名的文件。在执行git diff 或git-log 时,我想省略它们,以便更好地发现修改。
实际上,最好列出新文件和已删除文件的名称而不包含它们的内容。对于重命名为“新”的“旧”,我想选择区分“旧”和“新”。
【问题讨论】:
有时会有一些更改的文件以及一些新的、已删除和/或重命名的文件。在执行git diff 或git-log 时,我想省略它们,以便更好地发现修改。
实际上,最好列出新文件和已删除文件的名称而不包含它们的内容。对于重命名为“新”的“旧”,我想选择区分“旧”和“新”。
【问题讨论】:
--diff-filter 选项适用于 diff 和日志。
我经常使用--diff-filter=M,这将差异输出限制为仅内容修改。
要检测重命名和复制并在差异输出中使用它们,您可以分别使用-M 和-C,以及R 和C 选项到--diff-filter。
【讨论】:
git log 一起使用时,这将导致它完全忽略只添加和/或删除文件的提交。
--diff-filter=!D
Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
--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
【讨论】:
更新: Charles Bailey 的accepted answer 是正确的;所需的功能已经内置在 git 中。
我将把这个答案留在这里,因为它可能会为 git 未内置的东西提供一些想法。
git diff 通过与/dev/null 比较来显示新文件和已删除文件。编写一些查找/dev/null 并过滤掉以下几行直到下一个差异的东西(我自己会使用Perl)应该不会太难。然后git diff ... | the-filter。
重命名的文件是另一回事;我(还)没有很好的答案。
【讨论】:
... | less。)您可能会查看less 的-E 或-F 选项(尽管在我的系统上它不会让我看到输出)。