8

リポジトリ内の各ファイルのすべての貢献者を一覧表示したいと考えています。

これが現在私がしていることです:

find . | xargs -L 1 git blame -f | cut -d' ' -f 2-4 | sort | uniq

これは非常に遅いです。より良い解決策はありますか?

4

5 に答える 5

7

Taking ДМИТРИЙ's answer as a base, I'd say the following :

git ls-tree -r --name-only master ./ | while read file ; do
    echo "=== $file"
    git log --follow --pretty=format:%an -- $file | sort | uniq
done

Enhancement is that it follows file's rename in its history, and behaves correctly if files contain spaces (| while read file)

于 2012-07-31T12:59:42.950 に答える
5

の出力を分析する小さなスクリプトを作成しますgit log --stat --pretty=format:'%cN'。次の行に沿ったもの:

#!/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、次のように呼び出すことができます。

git log --stat=1000,1000 --pretty=format:'%cN' | perl ~/git-contrib.pl

利点: 呼び出しgitは 1 回だけです。これは、かなり高速であることを意味します。欠点: 別のスクリプトです。

于 2012-07-31T10:58:23.230 に答える
2

tldr :

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-treeFindは本当に悪い選択です。

    たとえばmaster、現在のディレクトリのブランチにある追跡ファイルのリストを取得します ( ./):

    git ls-tree -r --name-only master ./
    
  2. ファイルエディターのリストを取得するにはget shortlog( git blameis overkill):

    git shortlog -s -- $file
    

したがって、応答からの各ファイルに対して、必要に応じてその出力ls-treeを呼び出して変更する必要があります。shortlog

于 2012-07-31T10:55:27.273 に答える