Git'te iki işlem arasında değiştirilen satır sayısını nasıl hesaplayabilirim?


747

Git'te iki işlem arasında değiştirilen satır sayısını hesaplamanın kolay bir yolu var mı?

Bunu yapabileceğimi git diffve çizgileri sayabileceğimi biliyorum , ama bu sıkıcı görünüyor. Ben de bunu nasıl yapabileceğimi bilmek istiyorum.


3
BitBucket'e bak.
Alex78191

Yanıtlar:


1113

Sen istemek --statseçeneğine git diffveya bir komut dosyasında bu ayrıştırmak arıyorsanız --numstatseçeneği.

git diff --stat <commit-ish> <commit-ish>

--statbirleştirmelerden sonra görmeye alışık olduğunuz insan tarafından okunabilir çıktılar üretir; --numstatkomut dosyalarının kolayca yorumlayabileceği hoş bir tablo düzeni oluşturur.

Bir şekilde bunu aynı anda birden fazla taahhütte yapmak istediğinizi kaçırdım - bu bir görev git log. Ron DeVera buna değinir, ancak aslında bahsettiğinden çok daha fazlasını yapabilirsiniz. Yana git logdahili olarak istenen bilgileri yazdırmak için fark makine çağırır sen fark istatistik seçeneklerinden herhangi verebilir - sadece --shortstat. Kullanmak istediğiniz şey şudur:

git log --author="Your name" --stat <commit1>..<commit2>

ancak kullanabilir --numstatveya --shortstatyanı. git logtaahhütleri çeşitli şekillerde seçebilir - belgelere bir göz atın . --since(Karar aralıklarını belirtmek yerine, geçen haftadan bu yana taahhütleri seçin) ve --no-merges(birleştirme taahhütleri aslında değişiklik sunmaz ) gibi şeylerin yanı sıra güzel çıktı seçenekleri (--pretty=oneline, short, medium, full... ) .

Git günlüğünden taahhüt başına değişiklikler yerine toplam değişiklikleri almak için bir astar aşağıdadır (taahhüt seçimi seçeneklerini istediğiniz gibi değiştirin - bu, taahhüt1'den taahhüt2'ye kadar taahhüt eder):

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(git günlüğünün kesinleştirme hakkında bazı tanımlayıcı bilgiler yazdırmasına izin vermelisiniz; Rasgele seçtim, sonra awk'yi yalnızca istatistik bilgisine sahip olan üç alanlı satırları seçmek için kullandım)


2
Bu, "değiştirilen satırlar" hakkındaki orijinal soruya cevap vermez. Bir satır değişikliği hem eklenen hem de silinen satır olarak hesaplanır. Değiştirilen hatların sayısını hesaplamak, burada açıklanandan daha fazla çalışmaya ihtiyaç duyar.
Ville Laitila

12
@VilleLaitila: Bu, çok fazla çaba harcamadan alabileceğiniz kadar yakın ve OP ve 15 kişi için yeterince iyiydi. (Değiştirilen bir satır ne zaman eklenen bir satır ve silinen bir satır haline geldiğini nasıl tanımlıyorsunuz? - ve + satırı arasındaki mesafeyi satır uzunluğunun bir parçası olarak düzenleyerek?) Değişikliklerin ikiye katlandığını hepimiz biliyoruz; bunu yararlı bir değişim miktarı metriği olarak adlandırabiliriz ve hayatlarımıza devam edebiliriz.
Cascabel

188
git diff --shortstat <commit1> <commit2>istediğim oydu.
Kim

9
Başvuru için, için tarih biçimini --sinceve --until: gibi bir şey yesterday, 1 month 2 weeks 3 days 1 hour 1 second agoya da1979-02-26 18:30:00
juanmirocks

4
@Bryson Evet, bu yüzden bu satır diyor <commit-ish>- genel taahhütler, şubeler, etiketler ve genel olarak ref'ler dahil bir taahhüdü temsil eden herhangi bir şeyle çalışır . Ayrıca bkz. Stackoverflow.com/questions/23303549/…
Cascabel

193

Tembel için kullanın git log --stat.


14
Bu yararlı buldum -10, önceki on taahhüt göstermek için bir ekledi .
Choylton B.Higginbottom

2
İşleme geçmişini görüntülemeyi bitirdiğinizde Q, terminale dönmek için yazın.
Stevoisiak

180
git diff --shortstat

yalnızca değiştirilen ve eklenen satır sayısını verir. Bu yalnızca işaretlenmemiş değişikliklerle çalışır. Bir şubeyle karşılaştırmak için:

git diff --shortstat some-branch

3
Güzel! ama .. bunun sadece tatsız değişikliklerle çalıştığını unutmayın
TomCobo

3
Değişikliklerle sahnelemediyseniz git add, mutlaka yapıngit diff --shortstat --cached
TomNash

2463 dosya değişti, 39745 eklenti (+), 21383 silme (-) Geçen ay yaklaşık 5k - 10k arasında sildim. Bir şeyleri hareket ettirmek dışında yaptığım neredeyse hepsi bu. Bir şey yanlış. Kaldırılan dosyaları falan içermiyor mu?
jgmjgm

46
git diff --stat commit1 commit2

DÜZENLEME: Taahhütleri de belirtmeniz gerekir (parametreler olmadan çalışma dizinini dizinle karşılaştırır). Örneğin

git diff --stat HEAD^ HEAD

üst öğesini karşılaştırma HEADile HEAD.


1
Hiçbir zaman gerçekten kullanmaya gerek yoktur diff-index- diffön uç her şeyi halledebilir; dava diff-indexkapsamında --cached/--staged, inanıyorum. (Ve diff-indexOP'nin istediği gibi iki keyfi işi karşılaştırmak için kullanmanın bir yolu yoktur .)
Cascabel

Bunun çıktısı benim için hiçbir şey değil.
Mike

@Mike: Bir karattan ayrıldın mı? En son yaptığınız birleştirme taahhüdü müydü? Git fark olmadığını söylüyorsa, fark olmadığı için.
Cascabel

6
or git diff --stat HEAD
united united

1
Ayrıca, ne kadar geriye gitmek istediğinizi kullanarak HEAD~n, yalnızca ebeveynden daha geriye doğru karşılaştırabilirsiniz n. git diff --stat HEAD~5 HEADHEAD'e göre son 5 taahhüt için birleştirilmiş istatistikler gösterecektir.
Nathan Beck

18

Abcd123 (ilk taahhüt) ile wxyz789 (son taahhüt) arasındaki tüm taahhütlerinizi dahil etmek istediğinizi varsayarsak:

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

Bu, aşağıdaki gibi özlü çıktılar verir:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

Bunun çıktısı benim için hiçbir şey değil (taahhütte bulundum ve doğruladım - yazar git log ve başka hiçbir argüman kullanarak doğru).
Mike

Bu da bana oldu. İki komisyon yanlış sıradaydı, takas ederek düzeltildi.
bob esponja

1
Taahhüt sırasını güncelledi ve iki SHA'nın neyi temsil ettiğini açıkladı.
Yakaladığınız

3
--shortstatBayrak birlikte çalıştığı, harika git diffolsa (değil git log).
lucke84

Bunları nasıl özetleyebiliriz?
xpto

13

Tüm değişiklik günlüğünü belirli bir sürede almanın başka bir yolu

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

Çıktı:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

Uzun çıktı içeriğiyle, daha okunabilir olması için dosyaya dışa aktarabilirsiniz

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

2

Yukarıdaki tüm cevaplar doğru olsa da, son birçok işlemin sayısına ihtiyacınız varsa, birinin altında kullanmak yararlıdır

birinin altında son 5 taahhüt sayılır

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

son 10 taahhüdü saymak

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

generic - N'yi ihtiyacınız olan son işlem sayısıyla değiştirin

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

başlangıçtan itibaren tüm taahhütlerin sayısını almak

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


Bu, "" kuyruk "un dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmadığını verir.
Charles Roddie


1

Bu sorunu kendim için çözdüm, bu yüzden bulduğum şeyi paylaşacağım. Sonuç:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

Temel komut şuna benzer:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

Not $@Tartışmalarınızın üzerinde gibi geçmesine günlük komuta --author="Brian"veya --since=yesterday.

Bir git takma adına koymak için awk'den kaçmak dağınıktı, bunun yerine, yolumdaki ( ~/bin/git-stat-sum) çalıştırılabilir bir komut dosyasına koydum , daha sonra komut dosyamdaki takma adda kullandım .gitconfig:

[alias]
    summary = !git-stat-sum \"$@\"

Ve gerçekten iyi çalışıyor. Dikkat edilmesi gereken son bir şey file changes, değiştirilen benzersiz dosya sayısının değil, dosyadaki değişikliklerin sayısıdır. Aradığım şey bu, ama beklediğiniz gibi olmayabilir.

İşte bir iki örnek daha

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

Gerçekten, herhangi bir git logkomutu yerine koymanız gerekir git summary.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.