根据更改的types过滤git diff

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

我希望看到两个提交之间的差异,但排除不存在于其中一个或另一个(添加/删除)的path。 下面的Perl单线程说明了我想要的大部分内容:

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

但是,这会遗留diff --git a/path b/path新的或删除的文件。 另外,如果我不必parsing(如果任何大块包含与/ ^ diff /匹配的任何内容)也会更好。

我尝试的另一种select是:

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

它的产量比较好,但是还是觉得不舒服。

您正在寻找--diff-filter=M来显示两个分支之间只有文件* M * --diff-filter=M

man git-diff

--diff-filter=[ACDMRTUXB*]

只select文件

  • A添加
  • C复制
  • D已删除
  • M修改
  • R重命名
  • T有他们的types(模式)改变
  • U看到
  • X未知
  • B有他们的配对破碎
  • *全或无

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

将*(全或无)添加到组合中时,如果有任何文件与比较中的其他条件匹配,则select所有path; 如果没有与其他标准匹配的文件,则不会select任何内容。

因为Git 2.10(2016年第三季度)会提醒我们,有一个更简单的方法来“显示除了添加/删除文件之外的所有内容”。 (实际上从Git 1.8.5开始,2013年7月)

  git diff --diff-filter=ad master.. 

见Junio C gitstergitster )的 提交16726cf (2016年7月14日) 。
(由Junio C gitster合并- gitster -于2016年8月8日提交2f8c654 )

diff :文档diff-filter排除

在v1.8.5天, 7f2ea5f( diff :允许小写字母指定要排除的更改类,2013-07-17) 教导了“ --diff-filter ”机制将小写字母作为排除 ,但是我们忘记了文档。

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

这些大写字母可以降低排除。
例如--diff-filter=ad排除添加和删除的path。

你可以使用–diff-filter标志来做到这一点。 git diff --diff-filter=CMRTUXB master..应显示除添加/删除文件以外的所有内容。

查看可以使用的所有修改和新文件

 git diff --name-only --diff-filter=ACMR PREV_VERSION master 

PREV_VERSION是你第一次提交的散列。

要以zip的forms获得导出,您可以使用此代码

 git archive --output=export.zip HEAD $(git diff --name-only --diff-filter=ACMR PREV_VERSION HEAD) 

注意: .gitignore不在export.zip

我用记事本++(Windows),这些正则expression式从一个diff文件中筛选出扩展types和特定的path。

 ^Index.*\.(dll|pdb|exe|txt|zip|log|ism|resx|tlog|htm|lib)$[\s\S.]*?^Index ^Index: Shared/.+$[\s\S.]*?^Index ^Index: Next/source/Utility/.+$[\s\S.]*?^Index 

唯一的问题是,当它到达最后。 你必须“按住Ctrl + Home”,然后再次出现,直到找不到任何东西。

(用“索引”replace发现的内容)