如何在所选提交中生成`git log --stat - <path>`show * all *文件?</path>

时间:2012-05-22 23:51:01

标签: git

当我使用<path>参数和git log --stat来限制日志时 提交修改<path>,git列出<path>作为唯一修改过的文件 显示所选的提交。我希望看到所有修改 为每个选定的提交列出的路径。

例如:

$ echo test > a.txt
$ echo test > b.txt
$ git add a.txt b.txt
$ git commit -m test
 [...]
 2 files changed, 2 insertions(+), 0 deletions(-)
 [...]
$ git log -n1 --stat
 [...]

 a.txt |    1 +
 b.txt |    1 +
 2 files changed, 2 insertions(+), 0 deletions(-)
$ git log -n1 --stat -- a.txt
 [...]

 a.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

请注意,第二个git log,路径参数为a.txt “1个文件已更改”,实际上“2个文件已更改”。我想要git 告诉我a.txtb.txt都改变了,即使我 根据路径a.txt选择了提交。

更新:@jacknagel回答了我的问题,但事实证明他的解决方案在我的实际用例中不起作用。在我的实际用例中,我正在寻找修改文件的所有提交,包括重命名,在两个相关项目分歧的情况下。我需要弄清楚一个项目中的哪些变化意味着在另一个项目中有相应的变化(我需要做出)。不幸的是,git在我尝试同时使用--full-diff--follow时抱怨。

所以,在我的实际情况中,我正试图运行:

git log --stat --follow -- a.txt

在这种情况下有效的解决方案是:

git log --format='%H' --follow -- a.txt | xargs git show --stat -C

3 个答案:

答案 0 :(得分:11)

您可以使用--full-diff选项获取此行为:

   --full-diff
       Without this flag, "git log -p <path>..." shows commits that touch
       the specified paths, and diffs about the same specified paths. With
       this, the full diff is shown for commits that touch the specified
       paths; this means that "<path>..." limits only commits, and doesn't
       limit diff for those commits.

       Note that this affects all diff-based output types, e.g. those
       produced by --stat etc.

答案 1 :(得分:0)

首先找到提交ID,然后将它们传递给xargs(或gnu parallel),将每个ID提供给git show

git log --format='%H' --follow -- a.txt | xargs git show --stat -C

在使用PowerShell的Windows上,这样的东西应该可以工作(但我还没有对它进行过测试......):

git log --format='%H' --follow -- a.txt | ForEach-Object { git show --stat -C $_ }

答案 2 :(得分:-1)

您如何期望命令以不同于预期的方式运行?当你给出文件名时,你告诉git单独获取该文件的详细信息。如果您希望它显示两个文件,请使用命令

git log -n1 --stat .

git log -n1 --stat a.txt b.txt