根据更改类型筛选 git 差异

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

我希望看到两次提交之间的区别,但是要排除这两次提交中不存在的路径(添加/删除)。下面的 Perl 一行程序说明了我想要的大部分内容:

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

但是对于新建或删除的文件,留下了 diff --git a/path b/path行。另外,如果我不需要解析(例如,如果任何 hunk 包含任何匹配/^ diff/的内容,也会失败) ,那么它会更好。

我试过的另一个选择是:

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

它的输出更好,但仍然感觉骇客。

68662 次浏览

您可以使用—— diff-filter 标志来精确地执行此操作。

您正在寻找的 --diff-filter=M只显示文件 M修改之间的两个分支。

来自 man git-diff

--diff-filter=[ACDMRTUXB*]

只选择

  • 增加
  • C收到
  • D已删除
  • M改良版
  • 重命名
  • T的类型(模式)已更改
  • 解体
  • X未知
  • B的配对被破坏了
  • 全有或全无

可以使用筛选字符的任何组合。

*(All-or-none)添加到组合中时,所有路径为 中是否有匹配其他条件的文件,则选择 比较; 如果没有匹配其他条件的文件,则没有 被选中了。

此外,这些大写字母可以小写以排除。例如,--diff-filter=ad排除添加和删除的路径。

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

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

PREV_VERSION是第一次提交的散列。

要获得 zip 导出,可以使用以下代码

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

注意: .gitignore不在 export.zip

我使用 Notepad + + (Windows)和这些正则表达式从 diff 文件中筛选出扩展类型和某些路径。

^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”,然后再次执行,直到它什么也找不到。

(将找到的内容替换为‘ Index’)

正如 Git 2.10(2016年第三季度)提醒我们的那样,有一种更简单的方法可以“显示除添加/删除文件之外的所有内容”(实际上是从 Git 1.8.5,2013年7月开始的)

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

提交16726cf(2016年7月14日) by 滨野俊男(gitster)
(由 朱尼奥 · C · 哈马诺 gitster于2016年8月8日在 提交2f8c654合并)

diff: 排除文件 diff-filter

在 v1.8.5 days 中,< a href = “ https://github.com/git/git/commit/7f2ea5f0f2fb056314092cce23202096ca70f076”rel = “ nofollow noReferrer”> 7f2ea5f (diff: 允许小写字母指定 排除什么变化类,2013-07-17) 教“ --diff-filter” 机制将小写字母作为排除 ,但是我们忘记了 记录下来。

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

这些大写字母可以小写以排除。
例如,--diff-filter=ad排除了添加和删除的路径。

确保使用 Git 2.36(2022年第二季度)