如何在两次提交之间对某些文件执行git diff

时间:2015-07-16 07:56:15

标签: git

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

git diff [options] <commit> <commit> [--] [<path>...]

我只想比较*.h,*.c,*,*.cpp个文件。所以在阅读What option should be used restrict the git diff to a given set of file extensions?之后我尝试了类似下面的东西:

$ 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` -- `find -name '*.h' -print0`

我已经尝试了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文件之间的区别。

也许你有一个更好的主意,或者你看到可能是什么问题?

3 个答案:

答案 0 :(得分:0)

你可以试试这个

  git diff --name-only SHA1 SHA2

答案 1 :(得分:0)

Some or all identity references could not be translated.支持通配符,因此您只需在命令末尾添加:<path>即可。请务必首先记住-- *.h *.c *.cpp到git repo的根目录,因为此语法将在当前目录中查找cd.h.c(递归)。 / p>

所以:

.cpp

答案 2 :(得分:0)

你的问题是-print0使用nul-terminators来分隔文件名,但这最终将你的所有文件名作为单个参数传递给git diff(它不会理解{{} 1}} S)。

相反,请使用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} -- 输出以nul结尾的文件路径,传递给find,将这些路径拆分为xargs -0的参数。