首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每个文件的Git贡献者

每个文件的Git贡献者
EN

Stack Overflow用户
提问于 2012-07-31 18:05:01
回答 5查看 1.9K关注 0票数 8

我想列出存储库中每个文件的每个贡献者。

以下是我目前所做的工作:

代码语言:javascript
运行
复制
find . | xargs -L 1 git blame -f | cut -d' ' -f 2-4 | sort | uniq

这是非常慢的。有没有更好的解决方案?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-31 18:58:23

我将编写一个小脚本来分析git log --stat --pretty=format:'%cN'的输出;内容大致如下:

代码语言:javascript
运行
复制
#!/usr/bin/env perl

my %file;
my $contributor = q();

while (<>) {
    chomp;
    if (/^\S/) {
        $contributor = $_;
    }
    elsif (/^\s*(.*?)\s*\|\s*\d+\s*[+-]+/) {
        $file{$1}{$contributor} = 1;
    }
}

for my $filename (sort keys %file) {
    print "$filename:\n";
    for my $contributor (sort keys %{$file{$filename}}) {
        print "  * $contributor\n";
    }
}

(编写速度很快;不包括二进制文件等情况。)

如果您将此脚本存储为~/git-contrib.pl,则可以使用以下命令调用它:

代码语言:javascript
运行
复制
git log --stat=1000,1000 --pretty=format:'%cN' | perl ~/git-contrib.pl

优点:只调用git一次,这意味着它相当快。缺点:它是一个单独的脚本。

票数 5
EN

Stack Overflow用户

发布于 2012-07-31 20:59:43

以ДМИТРИЙ的回答为基础,我会这样说:

代码语言:javascript
运行
复制
git ls-tree -r --name-only master ./ | while read file ; do
    echo "=== $file"
    git log --follow --pretty=format:%an -- $file | sort | uniq
done

增强功能是它在历史记录中遵循文件的重命名,并且如果文件包含空格(| while read file),它将正确运行

票数 7
EN

Stack Overflow用户

发布于 2012-07-31 18:55:27

tldr

代码语言:javascript
运行
复制
for file in `git ls-tree -r --name-only master ./`; do
    echo $file
    git shortlog -s -- $file | sed -e 's/^\s*[0-9]*\s*//'
done

  1. 您可以使用git ls-tree获取存储库中所有跟踪的文件。Find真的是个糟糕的选择。

例如,获取当前目录(./)下分支master中被跟踪文件的列表:

git ls-tree -r --仅限名称的主控器。/

  • 您可以使用get shortlog获取文件编辑器列表(git blame是overkill):

$file shortlog -s -- git

因此,对于来自ls-tree响应的每个文件,您应该调用shortlog并根据需要修改其输出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11737681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档