根据更改的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 gitster
( gitster
)的 提交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发现的内容)