我能否让 Git 告诉我某个用户修改过的所有文件?

173

我希望能得到git给出的一个列表,其中包含一个用户修改过的所有文件,跨越所有的提交。

我的具体使用场景是我参与了一个Ruby on Rails项目的国际化工作,我们想知道哪些文件已经完成,哪些文件仍然需要完成。这些用户只在国际化方面进行过工作,而没有对代码库的其余部分进行过工作。因此,所有信息都应该在git中,但我不确定如何获取它。

5个回答

236
这将为您提供一个简单的文件列表,没有其他内容:
git log --no-merges --author="Pattern" --name-only --pretty=format:"" | sort -u

根据需要将--author切换为--committer。


1
“--name-only” 似乎只会输出文件名。鉴于这一事实,“--stat” 和 “--pretty=format:"" ”有什么作用?你可以不使用它们吗? - Jonah
1
@Jonah --pretty=format:"" 是必须的。我编辑了答案。 - Ian Kelling
3
功能很好,但有一个小故障:它会在输出的开头产生一个空链接,这意味着通过“wc -l”将结果导入管道以获取文件计数时会多算1个。 - joachim
1
@TimBoland 添加 --diff-filter=d - Alvin Cao
2
请注意,以下内容仅列出当前 HEAD 下发生的修改,即不包括除当前检出的分支以外的其他分支。如果要使用所有本地分支,请添加“--all”。 - CervEd
显示剩余3条评论

160

这不是唯一的方法,但它可行:

git log --pretty="%H" --author="authorname" |
    while read commit_hash
    do
        git show --oneline --name-only $commit_hash | tail -n+2
    done | sort | uniq

或者,作为一行代码:

git log --pretty="%H" --author="authorname" | while read commit_hash; do git show --oneline --name-only $commit_hash | tail -n+2; done | sort | uniq

1
这比 https://dev59.com/e2w15IYBdhLWcg3w3vle#6349483 慢得多。 - CervEd

10
尝试使用命令git log --stat --committer=<user>,只需将用户名称放在--committer=选项(或根据需要使用--author=)即可。这会按提交显示所有文件,因此可能会有一些重复。

1
git log --pretty= --author=@abcd.com --name-only | sort -u | wc -l

显示 git 仓库中公司修改的所有文件。
git log --pretty= --author=user@abcd.com --name-only | sort -u | wc -l

显示git仓库中作者名为'user'的所有修改过的文件。

1
请注意,OP 要求列出文件列表,而您的答案目前仅给出了计数,因为使用了 | wc -l(正如 joachim 所指出的可能会有误差)。不过,您提供的信息很有用,可以通过电子邮件地址搜索“公司贡献”(尽管这需要一个 .mailmap 文件 才能正确工作,因为有时人们会使用不同的电子邮件地址提交代码)! - Marcus Mangelsdorf
一件美丽的事物。谢谢。 - daparic

-1
如果你只想要文件名列表:
git log --author= --pretty=format:%h | xargs git diff --name-only | sort | uniq

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接