我一直在努力寻找git项目的所有作者,以便我可以询问有关重新授权他们的提交。我认为联系所有作者都没有意义,因为可能有些人在代码库中有代码,但它已被删除。因此,我只想与当前HEAD中可见的提交联系作者。
有人告诉我,git log有这个功能,但我找不到任何东西,除了像:
git log --format='%an <%ae>'
除了它不排除当前代码库中没有代码的作者之外,我想要实现的目标除外。
我怎样才能做到这一点?
答案 0 :(得分:6)
IANAL,但至于重新许可我不太确定只有获得当前项目中任何代码的作者的许可才足够。毕竟他们的贡献/提交以某种方式导致了项目的当前状态。
除此之外,你可能想看看git blame。它显示了作者在哪个提交中引入了哪个文件行。这可以让您更接近问题的解决方案。也许使用awk ... | sort | uniq
进行一些额外的后期处理可以完成剩下的工作。
但是,git blame
仅显示单个文件的信息,因此您必须对存储库中的所有文件重复此操作。
在Git存储库的根目录中,您可以在Linux系统上使用这样的shell命令:
find ./ -name '*.cpp' -print0 | xargs -0 -i git blame --show-email {} | awk ' { print $3 } ' | sort | uniq
这将使用find搜索C ++源文件(扩展名* .cpp),并对所有这些文件执行git blame
。 --show-email
的选项git blame
显示电子邮件地址而不是名称,这些名称更容易过滤,因为名称可以包含多个单词,而地址通常只有一个。 awk
然后只获取输出的第三列,即邮件地址。 (首先是短提交哈希,第二个是文件名。)最后,sort | uniq
用于删除重复项,仅显示每个地址一次。
(未经测试,但它可能会指向正确的方向。)
如果您只想让每个曾经向存储库发送过任何内容的作者,请使用
git log --format='%an <%ae>' | sort | uniq
代替。
答案 1 :(得分:1)
您可以使用git blame来确定当前贡献者的列表:
#!/bin/sh
set -e
IFS='
'
for f in `git ls-tree -r --name-only ${1:-HEAD}`; do
git blame -w -C -p "$f" | sed -n \
-e '/^author /{ s/^author //; h; }' \
-e '/^author-mail /{ s/^author-mail //; H; x; s/\n/ /p; }'
done | sort -u
您应该通过-w
来忽略空格更改,而使用-C来跟踪移动和副本以获得更准确的归因。此外,在瓷器模式下使用-p
输出运行它以便可靠地解析输出(即,不会被文件名中的空格绊倒。)
请注意,虽然-w
和-C
应该比没有它们更好的结果,但这仍然只是一种启发式方法,可能不适合您的目的。
答案 2 :(得分:0)
git-fame 程序根据幸存 locs 的数量列出贡献者,从而匹配请求的内容。
使用 pip install git-fame
~$ git fame --cost hour,month
Blame: 100%|██████████| 74/74 [00:00<00:00, 96.51file/s]
Total commits: 1173
Total ctimes: 1055
Total files: 180
Total hours: 255.1
Total loc: 2716
Total months: 8.7
| Author | hrs | mths | loc | coms | fils | distribution |
|:---------------------------|------:|-------:|------:|-------:|-------:|:----------------|
| Casper da Costa-Luis | 100 | 7 | 2171 | 770 | 63 | 79.9/65.6/35.0 |
| Stephen Larroque | 16 | 1 | 243 | 202 | 19 | 8.9/17.2/10.6 |
| Kyle Altendorf | 6 | 0 | 41 | 31 | 3 | 1.5/ 2.6/ 1.7 |
| Guangshuo Chen | 2 | 0 | 35 | 18 | 6 | 1.3/ 1.5/ 3.3 |
| Matthew Stevens | 2 | 0 | 32 | 3 | 2 | 1.2/ 0.3/ 1.1 |
| Noam Yorav-Raphael | 3 | 0 | 23 | 11 | 4 | 0.8/ 0.9/ 2.2 |
| Daniel Panteleit | 2 | 0 | 16 | 2 | 2 | 0.6/ 0.2/ 1.1 |
| Mikhail Korobov | 2 | 0 | 15 | 11 | 6 | 0.6/ 0.9/ 3.3 |
| Hadrien Mary | 3 | 0 | 15 | 31 | 10 | 0.6/ 2.6/ 5.6 |
| Johannes Hansen | 2 | 0 | 14 | 1 | 2 | 0.5/ 0.1/ 1.1
答案 3 :(得分:-1)
只需使用短信(参见https://git-scm.com/docs/git-shortlog):
$ git shortlog -se
26 Bart Simpson <elbarto@springfield.com>
6 Homer Simpson <homer.j.simpson@springfield.com>
103 Lisa Simpson <jazz@springfield.com>
34 Marge Simpson <marge@springfield.com>
这将打印出您的历史记录中按字母顺序排序的所有作者的列表,包括电子邮件地址和每位作者的提交数量。
默认情况下,它会分析导致HEAD
的历史记录,即导致当前提交的所有内容
我想这正是你想要的。
您可以使用-n
按提交计数排序,以找出最重要的提交者。
$ git shortlog -sen
103 Lisa Simpson <jazz@springfield.com>
34 Marge Simpson <marge@springfield.com>
26 Bart Simpson <elbarto@springfield.com>
6 Homer Simpson <homer.j.simpson@springfield.com>