Git taahhüt sayısını nasıl alabilirim?


753

Git depomun taahhütlerinin sayısını, biraz SVN revizyon numaralarına benzetmek istiyorum.

Amaç, benzersiz, artan bir yapı numarası olarak kullanmaktır.

Şu anda böyle, Unix / Cygwin / msysGit:

git log --pretty=format:'' | wc -l

Ama bunun bir hile olduğunu hissediyorum.

Bunu yapmanın daha iyi bir yolu var mı? Aslında wcgitmeme ve hatta Git'e ihtiyacım olmasa iyi olurdu , bu yüzden çıplak bir Windows üzerinde çalışabilirdi. Sadece bir dosya veya dizin yapısını okuyun ...


1
Burada ilginç cevaplar bulabilirsiniz: revizyon numarası için git eşdeğeri nedir?
Sebastien Varrette

190
git rev-list HEAD --count git rev-list
Jake Berger

14
@jberger: Bence yorumunuz bir cevaba dönüştürülmeli.
utapyngo

@utapyngo: Diğer 13 cevap verildiğinde gömüldüğünü biliyordum. Ben ettik buradan yayınlanmıştır sonra.
Jake Berger

@jberger, bu cevap git1.7.0 için işe yaramıyor.
Vorac

Yanıtlar:


1160

Bir revize (sayacını taahhüt almak için HEAD, masterbir karma taahhüt):

git rev-list --count <revision>

Tüm şubelerde taahhüt sayısını elde etmek için:

git rev-list --all --count

Bunu derleme tanımlayıcısı için kullanmamanızı öneririm, ancak gerekirse, oluşturduğunuz dalın sayısını kullanmak en iyisidir. Bu şekilde aynı revizyon her zaman aynı sayıya sahip olacaktır. Sayıyı tüm şubeler için kullanırsanız, diğer şubelerdeki etkinlik sayısı değiştirebilir.


27
git shortlog | grep -E '^[ ]+\w+' | wc -ltoplam sayı git shortlog | grep -E '^[^ ]'almak istiyorsanız ve her katılımcı için taahhüt numarası almak istiyorsanız.
skalee

2
İşaret ettiğiniz için teşekkürler wc -l. Minimalizm FTW. Cevabıma dahil ettim.
Benjamin Atkin

17
Bu çözüm hem hacky ( git log --pretty=format:'' | wc -lorijinal soruda verilen yaklaşıma benzer ) ve yanlış: eşleşmeyi ( git shortlog | grep -Ev '^[ ]+\w+') ters çevirerek ve örneğin mesajsız taahhütlerin (yani "<none>") sayılmadığını görerek bunu görebilirsiniz. Kullanımı git rev-list HEAD --counthem daha özlü hem de daha doğrudur.
ctrueden

17
@ BenAtkin: Özür dilerim; saldırgan olmak niyetim değildi, sadece olgusal. Yanıt tarihi hakkında alınan nokta. O zaman, çözümünüz mevcut olan en iyi çözüm olabilir. Ama git rev-list HEAD --countşimdi daha iyi bir çözüm olan ifademin yanındayım.
ctrueden

3
Ayrıca bir cevap eklendi ve eski sürümleri ile de çalışır:git log --oneline | wc -l
Jimmy Kane

155

git shortlog bir yoludur.


5
Ty. Bu, bir aralıktaki taahhütleri saydığımda benim için çalıştı; git shortlog sha1..sha2
RJFalconer

1
Evet, git shortlog'un ilk satırında işlem sayısı vardır. Sorun çözüldü.
Robert Massaioli

5
Taahhütlerin sayısı komisyona göre gruplandırılmıştır, o kadar iyi değil. Git shortlog'daki satırları sayabilir, ancak bu herhangi bir nedenle terminal olmadan ssh üzerinde çalışmaz (çağrı cihazı?). Sorucunun orijinal çözümü en iyisidir! git log --pretty = biçim: '' | wc -l
Sam Watkins

4
Ancak, git rev-list HEAD --countOP'de verilen orijinal yaklaşımdan ziyade öneririm . Testlerimde, git log --pretty=format:'' | wc -ltek tek kapalı.
ctrueden

3
@ctrueden git log --oneline | wc -lbiri tarafından kapalı değil (OS X 10.8.5).
Andy Stewart

111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: Verilen taahhütten (bu durumda HEAD ) ana bağlantıları takip ederek ulaşılabilen taahhütleri listele .

--count : Listede kaç taahhüt bulunduğunu belirten bir sayı yazdırın ve diğer tüm çıktıları bastırın.


101

Bu komut, komisyoncular tarafından gruplandırılmış işlemlerin sayısını döndürür:

git shortlog -s

Çıktı:

14 John lennon
9  Janis Joplin

-sArgümanın kasılma formu olduğunu bilmek isteyebilirsiniz --summary.


11
git shortlogtek başına toplam taahhüt sayısının asıl sorusunu ele almaz (yazar tarafından gruplandırılmaz). git rev-list HEAD --countBunun yerine kullanın .
ctrueden

5
Müthiş! Sen göre sıralayabilir | sort -nde
Mohsen

54

Taahhütler için benzersiz ve hala oldukça okunabilir bir tanımlayıcı arıyorsanız, git description sizin için bir şey olabilir.


2
Bu işe yarayabilir ve kullanımı özel bir algodan daha kolay olabilir. +1
VonC

2
Git tarifini bilmiyordum. Etiket adı ile sha1 arasındaki bu küçük sayı tam da aradığım şeydi. Teşekkür ederim.
Splo

2
GIT-VERSION-GEN betiğine ve git deposunda nasıl kullanıldığına ve Linux çekirdek kaynaklarındaki benzer betiğe (ve bunların Makefile'de nasıl kullanıldığına) bir göz atın.
Jakub Narębski

Bu benzersiz, ancak INCREMENTAL kimliği verir. Benim için çalışmıyor. Ancak Ben Atkin'in cevabı, pratikte artımlı olması gereken taahhüt sayımı sunar. Aaron Digulla'nın cevabı daha emin, ancak daha fazla çalışma gerektiriyor.
JOM

2
Evet, olduğunu, çünkü kavram bir bir artan kimliği dağıtılmış sürüm kontrol sistemleri ile herhangi bir anlam ifade etmez.
Bombe

34

Git'te bir "revizyon numarası" hakkında ilk düşünen siz değilsiniz , ancak ' wc' oldukça tehlikelidir, çünkü taahhütler silinebilir veya ezilebilir ve tarih yeniden ziyaret edilebilir.

"Revizyon numarası" Subversion için özellikle önemliydi çünkü birleşme durumunda gerekliydi (bu cephede SVN1.5 ve 1.6 iyileşti).

Doğru sayıyı belirlemek için bir dalın tüm geçmişine bakmayı içermeyen bir algoritma ile, yorumda bir revizyon numarası içeren bir ön taahhüt kancasıyla sonuçlanabilir .

Çarşı aslında böyle bir algoritma geliştirdi ve yapmak istedikleriniz için iyi bir başlangıç ​​noktası olabilir.

( Bombe'nin cevabının işaret ettiği gibi, Git aslında en son etikete, taahhütlerin sayısına ve ayrıca bir SHA-1 anahtarına dayanan kendi algoritmasına sahiptir). Sizin için işe yararsa cevabını görmelisiniz (ve oylamalısınız).


Aaron'un fikrini göstermek için Git taahhüt karmasını, uygulamanızla birlikte dağıttığınız uygulamanın "bilgi" dosyasına da ekleyebilirsiniz .

Bu şekilde, about box şöyle görünecektir:

Hakkında kutusu

Uygulamalı sayı taahhüt parçası olmakla 'uygulamanın 'bilgi' Dosya' etkin biçimde bağlayan paketleme işlemi sırasında oluşturulan uygulamalı teknik bir revizyon için yapı numarasını id .


2
Scriptimi Xcode 3 ile çalışacak şekilde güncelledim . Gist.github.com/208825 adresinden güncel bir sürüm alabilirsiniz .
Abizern

34

U sadece kullanabilirsiniz:

git shortlog -s -n

Sonuç:

 827  user one
    15  user two
     2  Gest 

22

Basit bir yol:

 git log --oneline | wc -l

oneline onu garantiler.


1
'wc' dahili veya harici komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmıyor.
user815693

Peki hangi sistemi kullanıyorsunuz? UNIX bir mi? /
Jimmy Kane

1
Binlerce taahhüdünüz varsa bu da daha hızlı görünüyor. Diğer tüm komutlar çok fazla zaman alır.
Danny Coulombe

21

Bir değişkeni elde etmek için en kolay yol:

export GIT_REV_COUNT=`git rev-list --all --count`

5
Gerçekten de, diğerlerinin söylediği gibi git rev-listdeğil, kullanılacak doğru araçtır git log.
Nayuki

1
HEAD'e ulaşmak için soydaki taahhütlerin sayısını saymak için: git rev-list --first-parent | wc -l
200_success

Sen gerek yok wc -lsadece kullanmak --countanahtarı: git rev-list --all --count.
slm

Teşekkürler @slm, cevabı güncelledim. Her ne kadar orijinal yanıtın --countanahtarın kendisinden daha eski olduğundan şüpheleniyorum .
John Gietzen

@JohnGietzen - oh evet bunu anladım 8-) yardım etmek için bu ayrıntıyı ekliyordu.
slm

17

Git shortlog, taahhüt ayrıntılarını almanın bir yoludur:

git shortlog -s -n

Bu işlem, yazar adının ardından gelen taahhütlerin sayısını verecektir. -S seçeneği, yazarın yaptığı her kesinleştirme için tüm kesinleştirme iletilerini kaldırır. İşleme iletilerini de görmek istiyorsanız aynı seçeneği kaldırın. Tüm listeyi sıralamak için -n seçeneği kullanılır. Bu yardımcı olur umarım.


2
git shortlogtek başına toplam taahhüt sayısının asıl sorusunu ele almaz (yazar tarafından gruplandırılmaz). git rev-list HEAD --countBunun yerine kullanın .
ctrueden



4

Master gibi sadece bir dal kullanıyorsanız, bunun harika olacağını düşünüyorum:

git rev-list --full-history --all | wc -l

Bu yalnızca bir sayı verir. Böyle bir şeye takma ad atabilirsiniz

git revno

işleri gerçekten uygun hale getirmek için. Bunu yapmak için .git/configdosyanızı düzenleyin ve ekleyin:

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

Bu Windows üzerinde çalışmaz. O işletim sistemi için "wc" eşdeğerini bilmiyorum, ama sizin için sayma yapmak için bir Python komut dosyası yazma çok platformlu bir çözüm olacaktır.

DÜZENLEME : İki işlem arasında sayım alın:


İki keyfi revizyon arasındaki taahhütlerin sayısını nasıl alacağını gösterecek bir cevap arıyordum ve hiç görmedim.

git rev-list --count [older-commit]..[newer-commit]

3

Derleme sırasında bir sayı oluşturun ve bir dosyaya yazın. Bir sürüm yaptığınızda, bu dosyayı "Derleme 147" yorumuyla (veya derleme numarası ne olursa olsun) uygulayın. Normal geliştirme sırasında dosyayı taahhüt etmeyin. Bu şekilde Git'te yapı numaraları ve sürümler arasında kolayca eşleme yapabilirsiniz.


Eğer iki dağıtılmış geliştirici yapı sayıları periyodik olarak çarpışmaz / kesişmez mi? Her ikisi de paylaşılan bir deponun aynı devirleri arasında bir yapı oluşturduysa ya da belki de çarpışma yalnızca paylaşılan repoda değişiklik yapmayan değişiklikler olsaydı gerçekleşirdi. Emin değil.
ocaklar

Tabii ama çatışma size ne yapacağınızı söylüyor: Sadece diğer adamla konuşun ya da her zaman daha fazla numara kullanın. Unutmayın: Bir sayı, kırık bir oluşturma işlemini sihirli bir şekilde iyileştiremez. Bir şeyi kontrol etmeniz gereken bir hatırlatma veya ipucu .
Aaron Digulla

1
Ahh, evet, sihirli buildno.txt dosyası geri kalanıyla birlikte işlendi. Küçük bir ekip veya paralel yapılardan kaçınan büyük bir ekip için iyi bir yaklaşım. Sadece işe yaramayabileceğini düşünebileceğim tek yer, bir inşa sürecine ihtiyaç duymayan (bina yapmak için tek bir kişi atamak) yazılı bir dil (python) kullanan büyük bir ekip içindir.
Ocaklar

3

Şirketimizde SVN'den Git'e geçtik. Revizyon numaralarının olmaması büyük bir sorundu!

git svn cloneSon SVN taahhüdünü SVN düzeltme numarasına göre yapın ve etiketleyin:

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

Daha sonra revizyon numarasını

git describe --tags --long

Bu komut şöyle bir şey verir:

7603-3-g7f4610d

Araçlar: Son etiket 7603'tür - bu SVN düzeltmesidir. 3 - ondan gelen taahhütlerin sayısıdır. Onları eklememiz gerek.

Dolayısıyla, düzeltme numarası bu komut dosyası tarafından sayılabilir:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)

1

Eskiden kullandığım şey:

git log | grep "^commit" | wc -l

Basit ama işe yaradı.


4
sayımı kırmak için "taahhüt" ile başlayan bir taahhüt mesajı satırı gerekir. Örneğin: "yanlışlıkla son \ ncommit'te ittiğim düzeltilmiş hatalar ve kırık testler"
Paweł Polewicz

1

Bash sözdizimini kullanarak,

$(git rev-list --count HEAD)

tamamen doğrusal tarih için iyi görünüyor. Ayrıca bazen şubelerden “sayı” almak istiyorsanız (kapalı master), şunları göz önünde bulundurun:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

Bir kasada çalıştırıldığında, masterbasit 1234.0ya da benzeri olsun . Bir şubenin kasasından 1234.13alındığında, o şubede 13 taahhüt yapılmışsa, böyle bir şey elde edersiniz . Açıkçası bu sadece belirli bir masterrevizyondan en fazla bir şubeye dayandığınız sürece faydalıdır .

--first-parent muhtemelen gerekli olmasa da, sadece diğer dalları birleştirmekten kaynaklanan bazı taahhütleri bastırmak için mikro sayıya eklenebilir.


1

Deneyebilirsin

git log --oneline | wc -l

veya depoya katkıda bulunan kişiler tarafından yapılan tüm taahhütleri listelemek

git shortlog -s

1

git config --global alias.count 'rev-list --all --count'

Bunu config'inize eklerseniz, sadece komutu referans alabilirsiniz;

git count


0

Git shortlog'u şu şekilde kullanın

git shortlog -sn

Veya bir takma ad oluşturun (ZSH tabanlı terminal için)

# show contributors by commits alias gcall="git shortlog -sn"


0

Bir yapmaya ne dersin alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
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.