リポジトリ内の各ファイルのすべての貢献者を一覧表示したいと考えています。
これが現在私がしていることです:
find . | xargs -L 1 git blame -f | cut -d' ' -f 2-4 | sort | uniq
これは非常に遅いです。より良い解決策はありますか?
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
)
の出力を分析する小さなスクリプトを作成します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 回だけです。これは、かなり高速であることを意味します。欠点: 別のスクリプトです。
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
を使用して、リポジトリ内のすべての追跡ファイルを取得できますgit ls-tree
。Find
は本当に悪い選択です。
たとえばmaster
、現在のディレクトリのブランチにある追跡ファイルのリストを取得します ( ./
):
git ls-tree -r --name-only master ./
ファイルエディターのリストを取得するにはget shortlog
( git blame
is overkill):
git shortlog -s -- $file
したがって、応答からの各ファイルに対して、必要に応じてその出力ls-tree
を呼び出して変更する必要があります。shortlog