2012-07-31 14 views
8

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ı ?

cevap

4

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

+0

'u düzeltmek için yanıtıma bakın. Bu hızlıdır, ancak tam dosya yollarını bildirmez. – log0

+0

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

+0

' --stat = 1000,1000' iş yaptı – log0

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. 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 ./ 
    
  2. 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.

+0

+ 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

5

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)

+0

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

İlgili konular