Her dosya için her bir katılımcıyı depoda listelemek istiyorum.Git her dosyanın katkıda bulunanları
find . | xargs -L 1 git blame -f | cut -d' ' -f 2-4 | sort | uniq
Bu çok yavaş: Burada
benim yaptığım şu anda. Daha iyi bir çözüm var mı ?
Her dosya için her bir katılımcıyı depoda listelemek istiyorum.Git her dosyanın katkıda bulunanları
find . | xargs -L 1 git blame -f | cut -d' ' -f 2-4 | sort | uniq
Bu çok yavaş: Burada
benim yaptığım şu anda. Daha iyi bir çözüm var mı ?
git log --stat --pretty=format:'%cN'
çıktısını analiz eden küçük bir komut dosyası yazabilirim; çizgisinde bir şey:
#!/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";
}
}
(sadece hızlı Yazılı; ikili dosyaları gibi durumlarda kapsamaz.) Eğer örneğin ~/git-contrib.pl
gibi, sen ile diyebiliriz, bu senaryoyu saklanan Eğer
:
git log --stat=1000,1000 --pretty=format:'%cN' | perl ~/git-contrib.pl
Avantajı: git
'u yalnızca bir kez arayın; bu da, bunun oldukça hızlı olduğunu gösterir. Dezavantaj: Bu ayrı bir komut dosyası. temel olarak Äìèòğèé cevabını alarak
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
Sen alabilirsiniz tüm git ls-tree
ile depoda dosyaları takip etti. Find
gerçekten kötü bir seçimdir. Örneğin
, simdiki (./
) 'de şube master
izlenen dosyanın listesini almak:
git ls-tree -r --name-only master ./
Sen get shortlog
ile dosya düzenleyenlerin listesini alabilirsiniz (git blame
overkill):
git shortlog -s -- $file
ls-tree
yanıtından her dosya için shortlog
numaralı telefonu arayın ve mod Çıktısını istiyorsan ancak istiyorsan.
+ 1, doğru bir yaklaşımdır, ancak dosya adlarını takip etmez ve dosya adı boşluk içeriyorsa başarısız olur. Bu – CharlesB
diyebilirim şu:
git ls-tree -r --name-only master ./ | while read file ; do
echo "=== $file"
git log --follow --pretty=format:%an -- $file | sort | uniq
done
Geliştirme onun geçmişinde adlandırmak dosya aşağıdaki ve dosyalar boşluk içermemelidir doğru olmadığını davranır olmasıdır (| while read file
)
Bu igor cevapla karşılaştırıldığında oldukça yavaş. Çok büyük bir deponuz var. Bu dosya başına birkaç saniye sürer. – log0
'u düzeltmek için yanıtıma bakın. Bu hızlıdır, ancak tam dosya yollarını bildirmez. – log0
Dizin yapınız, dosya adlarının kesilebilmesi için derinse, '--stat 'seçeneği için isteğe bağlı yüksek bir çıktı genişliği parametresi belirtmeniz yeterlidir, örn. '--stat = 1000' – igor
' --stat = 1000,1000' iş yaptı – log0