按类型过滤git diff

ben*_*izi 105 git diff

有没有办法限制git diff更改的文件?

我想看看两个提交之间的差异,但排除一个或另一个中不存在的路径(添加/删除).以下Perl单线程说明了我想要的大部分内容:

git diff master.. | perl -lnwe 'print unless /^(new|deleted) file/../^diff/ and not /^diff/'
Run Code Online (Sandbox Code Playgroud)

但是这会diff --git a/path b/path为新文件或删除的文件留下线条.另外,如果我不需要解析它会更好(如果任何hunk包含匹配/ ^ diff /的任何内容,也会失败).

我尝试的另一种选择是:

git diff --name-status (args) | perl -lnwe 'print if s/^M\s+//' | xargs git diff (args) --
Run Code Online (Sandbox Code Playgroud)

它的输出更好,但仍然感觉很乱.

zen*_*zen 186

您正在寻找--diff-filter=M仅显示两个分支之间的文件*M*odified.

man git-diff

--diff-filter=[ACDMRTUXB*]

仅选择文件

  • A 添加
  • C 复制
  • D 删除
  • M 改性
  • R 改名
  • T 他们的类型(模式)改变了
  • U 取消合并
  • X 未知
  • B 他们的配对破了
  • * 全或无

可以使用过滤器字符的任何组合.

当*(全部或全部)添加到组合中时,如果有任何文件与比较中的其他条件匹配,则选择所有路径; 如果没有与其他条件匹配的文件,则不会选择任何内容.

  • 尼斯和另一个答案指出小写意味着排除。非常方便地排除已删除的文件。 (5认同)
  • 使用 --diff-filter=AMR 忽略已删除的文件时,请避免我的愚蠢错误:如果要删除文件“x”,则 git diff HEAD HEAD~1 --name-only --diff-filter=AMR 将仍然列出“x”。为什么?因为 _from_ HEAD _towards_ HEAD~1 文件被添加,而不是被删除。 (2认同)
  • T的描述令人困惑.来自`man git diff`"的类型(即常规文件,符号链接,子模块,...)已更改(T)," (2认同)

Von*_*onC 15

正如Git 2.10(2016年第3季度)将提醒我们的,有一种更简单的方法来"显示除添加/删除文件之外的所有内容".(实际上自Git 1.8.5,2013年7月)

 git diff --diff-filter=ad master..
Run Code Online (Sandbox Code Playgroud)

Junio C Hamano()提交16726cf(2016年7月14日).(由Junio C Hamano合并- -提交2f8c654,2016年8月8日)gitster
gitster

diff:文件diff-filter排除

在v1.8.5天,7f2ea5f(diff:允许使用小写字母指定要排除的更改类,2013-07-17) 教会了--diff-filter将小写字母作为排除的机制,但我们忘记记录它.

所以现在的文档diff-options(最后)包括:

这些大写字母可以降级为排除.
例如,--diff-filter=ad排除添加和删除的路径.


小智 6

要查看所有修改过的文件和新文件,您可以使用

git diff --name-only --diff-filter=ACMR PREV_VERSION master
Run Code Online (Sandbox Code Playgroud)

PREV_VERSION是您第一次提交的哈希值。

要导出为 zip,您可以使用此代码

git archive --output=export.zip HEAD $(git diff --name-only --diff-filter=ACMR PREV_VERSION HEAD)
Run Code Online (Sandbox Code Playgroud)

注:.gitignore不在export.zip


Lil*_*ard 5

您可以使用 --diff-filter 标志来精确执行此操作。git diff --diff-filter=CMRTUXB master..应该显示除添加/删除的文件之外的所有内容。