当我使用<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.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
答案 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