Güncelleme
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
Yolda bazı şeyleri güncelledim.
Kolaylık sağlamak için bunu kendi komutuna da koyabilirsiniz:
#!/bin/bash
# save as i.e.: git-authors and set the executable flag
git ls-tree -r -z --name-only HEAD -- $1 | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
bunu yolunuzda bir yerde saklayın veya yolunuzu değiştirin ve
git authors '*/*.c' # look for all files recursively ending in .c
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
git authors 'Makefile' # just count lines of authors in the Makefile
Orijinal Yanıt
Kabul edilen cevap işi yaparken yavaştır.
$ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \
|xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr
neredeyse anlık.
Şu anda izlenen dosyaların bir listesini almak için
git ls-tree --name-only -r HEAD
Bu çözüm file, dosya türünü belirlemek için çağrı yapılmasını önler ve performans nedenleriyle istenen uzantıyla eşleştirmek için grep kullanır. Tüm dosyaların dahil edilmesi gerekiyorsa, bunu satırdan kaldırmanız yeterlidir.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
dosyalar kabuklar için kötü olan boşluklar içeriyorsa kullanabilirsiniz:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
Bir komut çağırmak ve bağımsız değişkenleri dağıtmak için xargs kullanarak bir dosya listesi (kanal aracılığıyla) verin. Birden fazla dosyanın işlenmesine izin veren komutlar -n1. Bu durumda çağırırız git blame --line-porcelainve her çağrı için tam olarak 1 argüman kullanırız.
xargs -n1 git blame --line-porcelain
Daha sonra çıktıyı "yazar" oluşumuna göre filtreleyip listeyi sıralıyoruz ve yinelenen satırları sayıyoruz
grep "^author "|sort|uniq -c|sort -nr
Not
Diğer yanıtlar aslında yalnızca boşluk içeren satırları filtreler.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
Yukarıdaki komut, en az bir boşluk olmayan karakter içeren satırların yazarlarını yazdıracaktır. Ayrıca \w*[^\w#], boşluk olmayan ilk karakterin a olmayan satırları da hariç tutacak eşleşmeyi kullanabilirsiniz #(birçok komut dosyası dilinde yorum yapın).