如何仅在2次提交之间对某些文件执行git差异

如何仅在2次提交之间对某些文件执行git差异,git,Git,根据git diff手册,您应该能够执行以下操作 git diff [options] <commit> <commit> [--] [<path>...] 我尝试了find-name'*.h'-print0命令,它输出了大量.h文件。但是当我运行上面的整个命令时,我没有得到任何结果 以下命令也可以正常工作: git diff --shortstat `git rev-list --since="jun 30 2014" --reverse origin/m

根据git diff手册,您应该能够执行以下操作

git diff [options] <commit> <commit> [--] [<path>...]
我尝试了
find-name'*.h'-print0
命令,它输出了大量
.h
文件。但是当我运行上面的整个命令时,我没有得到任何结果

以下命令也可以正常工作:

git diff --shortstat `git rev-list --since="jun 30 2014" --reverse origin/master | head -1`..`git rev-list --until="dec 31 2014" origin/master | head -1`
它打印出来了

372 files changed, 31650 insertions(+), 9580 deletions(-)
但我假设这适用于repo中存储的所有文件,我只想知道
.h.c.cpp
文件之间的区别

也许您有更好的想法,或者您看到了可能存在的问题?

您可以试试这个

  git diff --name-only SHA1 SHA2
支持通配符,因此您只需在命令末尾添加:
-*.h*.c*.cpp
。请务必记住首先将
cd
放到git repo的根目录,因为此语法将在当前目录(递归)中查找
.h
.c
.cpp

因此:


您的问题是,
-print0
使用nul终止符来分隔文件名,但这最终会将所有文件名作为单个参数传递给
git diff
(它无法理解
nul

相反,请使用
xargs

# variables for sanity
START=$(git rev-list --since="jun 30 2014" --reverse origin/master | head -1)
END=$(git rev-list --until="dec 31 2014" origin/master | head -1)

find . \( -name '*.h' -o -name '*.cpp' -o -name '*.c' \) -print0 | xargs -0 git diff --shortstat ${START}..${END} --

find
输出以nul结尾的文件路径,这些路径被传递到
xargs-0
,它将这些路径拆分为参数,以
git diff

什么
*.h
不递归查找
*.h
。它是由您的shell展开的,大多数shell(包括bash)只在当前目录中执行通配符展开。@nnoneo您不正确。我已经测试过,它适用于
tcsh
bash
中嵌套子目录中的文件。我甚至可以用引号括起来:
-“*.h*”*.c*.cpp”
。它仍然有效,当它被引用时,它肯定不会被shell扩展。Git是否能够处理语法可能取决于您拥有的Git版本(我检查了它是否在2.1.2中工作,但在1.7.1中不工作)
cd `git rev-parse --show-toplevel`
git diff --shortstat `git rev-list --since="jun 30 2014" --reverse origin/master | head -1`..`git rev-list --until="dec 31 2014" origin/master | head -1` -- *.h *.c *.cpp
# variables for sanity
START=$(git rev-list --since="jun 30 2014" --reverse origin/master | head -1)
END=$(git rev-list --until="dec 31 2014" origin/master | head -1)

find . \( -name '*.h' -o -name '*.cpp' -o -name '*.c' \) -print0 | xargs -0 git diff --shortstat ${START}..${END} --