Jak uzyskać liczbę zatwierdzeń Git?


752

Chciałbym uzyskać liczbę zatwierdzeń z mojego repozytorium Git, trochę jak numery wersji SVN.

Celem jest użycie go jako unikalnego, rosnącego numeru kompilacji.

Obecnie tak robię na Unix / Cygwin / msysGit:

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

Ale czuję, że to trochę hack.

Czy jest na to lepszy sposób? Byłoby fajnie, gdybym naprawdę nie potrzebował wcani nawet Gita, aby mógł działać na nagim systemie Windows. Po prostu przeczytaj plik lub strukturę katalogów ...


1
Możesz znaleźć interesujące odpowiedzi tutaj: jaki jest odpowiednik git dla numeru wersji?
Sebastien Varrette

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

14
@jberger: Myślę, że twój komentarz powinien zostać przekształcony w odpowiedź.
utapyngo

@utapyngo: biorąc pod uwagę 13 innych odpowiedzi, wiedziałem, że zostanie pochowany. Ja napisałem go tu wtedy.
Jake Berger,

@jberger, ta odpowiedź nie działa dla git1.7.0.
Vorac

Odpowiedzi:


1159

Aby uzyskać liczbę zatwierdzeń dla wersji ( HEAD, masterskrót mieszania):

git rev-list --count <revision>

Aby uzyskać liczbę zatwierdzeń we wszystkich gałęziach:

git rev-list --all --count

Odradzam używanie tego do identyfikatora kompilacji, ale jeśli musisz, prawdopodobnie najlepiej użyć liczby dla gałęzi, na której budujesz. W ten sposób ta sama wersja zawsze będzie miała ten sam numer. Jeśli użyjesz liczby dla wszystkich gałęzi, aktywność w innych gałęziach może zmienić liczbę.


27
git shortlog | grep -E '^[ ]+\w+' | wc -ljeśli chcesz uzyskać łączną liczbę i git shortlog | grep -E '^[^ ]'jeśli chcesz uzyskać liczbę zatwierdzeń dla każdego uczestnika.
skalee

2
Dzięki za wskazanie wc -l. Minimalizm FTW. Włączyłem to do mojej odpowiedzi.
Benjamin Atkin,

17
To rozwiązanie jest zarówno hackerskie (podobne do git log --pretty=format:'' | wc -lpodejścia podanego w pierwotnym pytaniu), jak i niepoprawne: możesz to zobaczyć, odwracając match ( git shortlog | grep -Ev '^[ ]+\w+') i widząc, że np. Zatwierdzenia bez wiadomości (tj. „<none>”) nie są liczone. Korzystanie git rev-list HEAD --countjest bardziej zwięzłe i dokładniejsze.
ctrueden

17
@BenAtkin: Moje przeprosiny; nie chciałem być obraźliwy, tylko faktyczny. Punkt wzięty o datę odpowiedzi. W tej chwili Twoje rozwiązanie mogło być najlepszym dostępnym. Ale podtrzymuję moje oświadczenie, które git rev-list HEAD --countjest teraz lepszym rozwiązaniem.
ctrueden

3
Dodano również odpowiedź i działa również ze starymi wersjami:git log --oneline | wc -l
Jimmy Kane

155

git shortlog jest jeden sposób.


5
Ty. To działało dla mnie podczas liczenia zatwierdzeń w zakresie; git shortlog sha1..sha2
RJFalconer,

1
Tak, w pierwszym wierszu git shortlog znajduje się liczba zatwierdzeń. Problem rozwiązany.
Robert Massaioli,

5
Liczba zatwierdzeń jest pogrupowana według committera, co nie jest zbyt dobre. Może liczyć wiersze w git shortlog, ale z jakiegoś powodu nie działa to na ssh bez terminala (pager?). Oryginalne rozwiązanie pytającego jest najlepsze! git log --pretty = format: '' | wc-l
Sam Watkins

4
Sugerowałbym jednak git rev-list HEAD --countraczej niż oryginalne podejście podane w PO. W moich testach git log --pretty=format:'' | wc -ljest wyłączony o jeden.
ctrueden

3
@ctrueden git log --oneline | wc -lnie jest wyłączony przez jeden (OS X 10.8.5).
Andy Stewart

111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: Lista zatwierdzeń, które są osiągalne, podążając za linkami nadrzędnymi z podanego zatwierdzenia (w tym przypadku HEAD ).

--count : Wydrukuj liczbę wskazującą, ile zatwierdzeń byłoby na liście, i pomiń wszystkie inne dane wyjściowe.


100

To polecenie zwraca liczbę zatwierdzeń pogrupowanych według podmiotów zatwierdzających:

git shortlog -s

Wynik:

14 John lennon
9  Janis Joplin

Możesz chcieć wiedzieć, że -sargumentem jest forma skurczu --summary.


11
git shortlogsam w sobie nie odnosi się do pierwotnego pytania o całkowitą liczbę zatwierdzeń (nie pogrupowanych według autora). Użyj git rev-list HEAD --countzamiast tego.
ctrueden

5
Niesamowite! Można rozwiązać to przez | sort -nzbyt
Mohsen

54

Jeśli szukasz unikalnego i wciąż dość czytelnego identyfikatora zatwierdzeń, git opisz może być właśnie dla Ciebie.


2
To może działać i byłoby łatwiejsze w użyciu niż niestandardowe algo. +1
VonC

2
Nie wiedziałem, żeby Git opisał. Ten mały numer między nazwą znacznika a sha1 był właśnie tym, czego szukałem. Dziękuję Ci.
Splo

2
Spójrz na skrypt GIT-VERSION-GEN i jak jest używany w repozytorium git oraz podobny skrypt w źródłach jądra Linux (i jak są one używane w Makefile).
Jakub Narębski

Daje to unikalny, ale NIE PRZYKŁADOWY identyfikator. Nie działa dla mnie. Jednak odpowiedzi Bena Atkina oferują liczbę zatwierdzeń, która w praktyce powinna być przyrostowa. Odpowiedź Aarona Digulli jest bardziej pewna, ale wymaga również więcej pracy.
JOM

2
Tak, to dlatego, że pojęcie o bieżących ID nie ma sensu z rozproszonych systemów kontroli wersji.
Bombe

34

Nie jesteś pierwszym, który myśli o „numerze wersji” w Git , ale „ wc” jest dość niebezpieczne, ponieważ zatwierdzenie można usunąć lub zmiażdżyć, a historia powrócić.

„Numer wersji” był szczególnie ważny dla Subversion, ponieważ był potrzebny w przypadku scalenia (SVN1.5 i 1.6 poprawiły się na tym froncie).

Możesz skończyć z hakiem poprzedzającym zatwierdzenie, który zawierałby numer zmiany w komentarzu, z algorytmem nie wymagającym przeglądania całej historii gałęzi w celu ustalenia poprawnej liczby.

Bazar faktycznie wymyślił taki algorytm i może być dobrym punktem wyjścia do tego, co chcesz zrobić.

(Jak wskazuje odpowiedź Bombe, Git ma właściwie własny algorytm, oparty na najnowszym tagu, plus liczbę zatwierdzeń i odrobinę klucza SHA-1). Powinieneś zobaczyć (i pochwalić) jego odpowiedź, jeśli zadziała dla ciebie.


Aby zilustrować pomysł Aarona , możesz również dołączyć skrót Git commit do pliku „informacji” aplikacji, który dystrybuujesz wraz z aplikacją.

W ten sposób pole about wyglądałoby następująco:

O pudełku

Numer aplikacyjny jest częścią zatwierdzenia, ale plik „informacji” aplikacji jest generowany podczas procesu pakowania, skutecznie łącząc numer kompilacji aplikacji z identyfikatorem wersji technicznej .


2
Zaktualizowałem skrypt do pracy z Xcode 3. Możesz pobrać aktualną wersję ze strony gist.github.com/208825 .
Abizern

34

Możesz po prostu użyć:

git shortlog -s -n

Wynik:

 827  user one
    15  user two
     2  Gest 

22

Prostym sposobem jest:

 git log --oneline | wc -l

oneline zapewnia to.


1
„wc” nie jest rozpoznawane jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy.
user815693,

Z jakiego systemu korzystasz? Czy to UNIX? /
Jimmy Kane

1
Wydaje się to również szybsze, jeśli masz tysiące zmian. Wszystkie pozostałe polecenia zajmują zbyt dużo czasu.
Danny Coulombe,

21

Aby przekształcić go w zmienną, najprostszym sposobem jest:

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

5
Rzeczywiście, git rev-listjest to właściwe narzędzie do użycia, a nie git logjak inne powiedzą.
Nayuki,

1
Aby policzyć liczbę zatwierdzeń w linii, aby dotrzeć do HEAD: git rev-list - first-parent | wc -l
200_success

Nie trzeba wc -lpo prostu użyć --countprzełącznika: git rev-list --all --count.
slm

Dzięki @slm, zaktualizowałem odpowiedź. Chociaż podejrzewam, że oryginalna odpowiedź jest starsza niż --countsam przełącznik.
John Gietzen,

@JohnGietzen - och tak, pomyślałem, że 8-), właśnie dodałem ten szczegół, aby pomóc.
slm

17

Git shortlog jest jednym ze sposobów uzyskania szczegółów zatwierdzenia:

git shortlog -s -n

Spowoduje to podanie liczby zatwierdzeń i nazwy autora. Opcja -s usuwa wszystkie komunikaty zatwierdzeń dla każdego zatwierdzenia dokonanego przez autora. Usuń tę samą opcję, jeśli chcesz widzieć również komunikaty zatwierdzeń. Opcja -n służy do sortowania całej listy. Mam nadzieję że to pomoże.


2
git shortlogsam w sobie nie odnosi się do pierwotnego pytania o całkowitą liczbę zatwierdzeń (nie pogrupowanych według autora). Użyj git rev-list HEAD --countzamiast tego.
ctrueden



4

Jeśli używasz tylko jednej gałęzi, takiej jak master, myślę, że to zadziała świetnie:

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

Spowoduje to wyświetlenie tylko liczby. Możesz to zmienić na coś takiego

git revno

aby rzeczy były naprawdę wygodne. W tym celu edytuj .git/configplik i dodaj go w:

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

To nie będzie działać w systemie Windows. Nie znam odpowiednika „wc” dla tego systemu operacyjnego, ale napisanie skryptu w języku Python w celu liczenia dla Ciebie byłoby rozwiązaniem wieloplatformowym.

EDYCJA : Uzyskaj licznik między dwoma zatwierdzeniami:


Szukałem odpowiedzi, która pokaże, jak uzyskać liczbę zatwierdzeń między dwiema dowolnymi wersjami i nie widziałem żadnej.

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

3

Wygeneruj liczbę podczas kompilacji i zapisz ją do pliku. Za każdym razem, gdy tworzysz wydanie, zatwierdzaj ten plik z komentarzem „Kompilacja 147” (lub niezależnie od tego, jaki jest obecnie numer kompilacji). Nie zatwierdzaj pliku podczas normalnego programowania. W ten sposób możesz łatwo mapować między numerami kompilacji i wersjami w Git.


Gdyby dwaj rozproszeni programiści nie robili tego, ich numery kompilacji nie kolidowałyby okresowo? Co by było, gdyby obaj dokonali kompilacji między tymi samymi wersjami wspólnego repozytorium, a może kolizja wystąpiłaby tylko wtedy, gdyby którekolwiek zmiany nie zostały zatwierdzone we wspólnym repo Niepewny.
płyty grzewcze

Jasne, ale konflikt mówi ci, co masz zrobić: po prostu porozmawiaj z drugim facetem lub zawsze używaj wyższej liczby. Pamiętaj: liczba nie może magicznie wyleczyć zepsutego procesu kompilacji. To tylko przypomnienie lub podpowiedź , że musisz coś sprawdzić.
Aaron Digulla

1
Ach, tak, magiczny plik buildno.txt zostaje popełniony wraz z resztą. Dobre podejście dla małego zespołu lub dużego zespołu, który unika równoległych kompilacji. Jedyne miejsce, o którym mogę myśleć, że może nie działać tak dobrze, to dla dużego zespołu używającego języka skryptowego (python), który nie potrzebuje procesu kompilacji (aby przypisać jedną osobę do budowania).
płyty grzewcze

3

W naszej firmie przenieśliśmy się z SVN do Git. Brak numerów wersji był dużym problemem!

Wykonaj git svn clone, a następnie oznacz ostatnie zatwierdzenie SVN jego numerem wersji SVN:

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

Następnie możesz uzyskać numer wersji za pomocą

git describe --tags --long

To polecenie daje coś takiego:

7603-3-g7f4610d

Oznacza: Ostatni tag to 7603 - to wersja SVN. 3 - to liczba zatwierdzeń z niego. Musimy je dodać.

Tak więc numer wersji można policzyć za pomocą tego skryptu:

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

1

Ten, którego użyłem to:

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

Proste, ale zadziałało.


4
do przerwania liczenia potrzeba jednego wiersza komunikatu zatwierdzenia rozpoczynającego się od „zatwierdzenia”. Na przykład: „poprawione błędy i połamane testy, które przypadkowo wciśnięty ostatni \ ncommit”
Paweł Polewicz

1

Używając składni Bash,

$(git rev-list --count HEAD)

wygląda dobrze na czysto liniową historię. Jeśli chcesz czasem mieć „liczby” z gałęzi (na podstawie master), rozważ:

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

Po uruchomieniu z kasy masterotrzymujesz po prostu coś 1234.0podobnego. Po uruchomieniu z kasy oddziału otrzymasz coś takiego 1234.13, jeśli dokonano 13 zatwierdzeń w tym oddziale. Oczywiście jest to przydatne tylko wtedy, gdy bazujesz na co najwyżej jednej gałęzi z danej masterwersji.

--first-parent można dodać do mikro-liczby, aby ukryć niektóre zatwierdzenia wynikające tylko z połączenia innych gałęzi, chociaż prawdopodobnie nie jest to konieczne.


1

Możesz spróbować

git log --oneline | wc -l

lub aby wyświetlić listę wszystkich zatwierdzeń wykonanych przez osoby uczestniczące w repozytorium

git shortlog -s

1

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

Jeśli dodasz to do swojej konfiguracji, możesz po prostu odwołać się do polecenia;

git count


0

Używaj git shortlog w ten sposób

git shortlog -sn

Lub utwórz alias (dla terminala opartego na ZSH)

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


0

Co powiesz na zrobienie alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.