8

当我使用<path>参数 withgit 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,带有 path 参数的第二个a.txt表示“1 个文件已更改”,而实际上是“2 个文件已更改”。我希望 git 告诉我两者都a.txt发生了b.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
4

3 回答 3

12

--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.
于 2012-05-23T05:29:01.907 回答
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 $_ }
于 2015-02-20T18:29:44.023 回答
-1

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

git log -n1 --stat .

或者

git log -n1 --stat a.txt b.txt
于 2012-05-23T05:25:42.593 回答