2012-07-31 7 views
8

Chcę wyświetlić listę wszystkich autorów każdego pliku w repozytorium.Git współtwórcy każdego pliku

Tu jest obecnie, co robię:

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

ten jest bardzo powolny. Czy istnieje lepsze rozwiązanie?

Odpowiedz

4

Napisałbym mały skrypt, który analizuje wyjście git log --stat --pretty=format:'%cN'; coś wzdłuż linii:

#!/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"; 
    } 
} 

(pisemna tylko szybko; nie obejmuje takich przypadków plików binarnych.)

Jeśli przechowywane ten skrypt, na przykład jako ~/git-contrib.pl, można nazwać go:

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

Zaleta: zadzwoń pod numer git tylko raz, co oznacza, że ​​jest dość szybki. Wada: to oddzielny skrypt.

+0

To jest szybkie, ale nie wyświetla pełnych ścieżek plików. – log0

+0

Jeśli struktura katalogów jest zbyt głęboka, aby nazwy plików zostały obcięte, po prostu określ dowolny parametr o wysokiej szerokości wyjściowej dla opcji '--stat', np. '--stat = 1000' – igor

+0

' --stat = 1000,1000' wykonał zadanie – 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. można uzyskać wszystkie śledzone pliki w repozytorium z git ls-tree. Find to naprawdę zły wybór.

    Na przykład, uzyskać listę gąsienicowego pliku w branży master w bieżącym katalogu (./):

    git ls-tree -r --name-only master ./ 
    
  2. Można uzyskać listę redaktorów plików z get shortlog (git blame jest przesadą):

    git shortlog -s -- $file 
    

Tak więc, dla każdego pliku z odpowiedzi ls-tree powinieneś zadzwonić pod numer shortlog i mod Jeśli chcesz, możesz go wydrukować.

+0

+ 1, jest to poprawne podejście, jednak nie jest zgodne z nazwami plików, a jeśli nazwa pliku zawiera spację, kończy się niepowodzeniem. Zobacz moją odpowiedź na naprawienie tego – CharlesB

5

Biorąc odpowiedź Äěčňđčé jako podstawy, powiedziałbym następujące:

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

Enhancement jest to, że następuje pliku, zmiana nazwy w swojej historii, i zachowuje się poprawnie, jeśli pliki zawierają spacje (| while read file)

+0

To jest dość powolne w porównaniu do odpowiedzi igor. Mamy ogromne repozytorium. zajmuje to kilka sekund na plik. – log0