Wie erhalte ich die Git-Commit-Anzahl?

753

Ich möchte die Anzahl der Commits meines Git-Repositorys erhalten, ähnlich wie die SVN-Revisionsnummern.

Das Ziel ist es, es als eindeutige, inkrementierende Build-Nummer zu verwenden.

Das gefällt mir derzeit unter Unix / Cygwin / msysGit:

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

Aber ich denke, es ist ein bisschen ein Hack.

Gibt es einen besseren Weg, das zu tun? Es wäre cool, wenn ich wcGit nicht brauchen würde , also könnte es auf einem nackten Windows funktionieren. Lesen Sie einfach eine Datei oder eine Verzeichnisstruktur ...

Splo
quelle
1
Hier finden Sie interessante Antworten: Was ist das Git-Äquivalent für die Revisionsnummer?
Sebastien Varrette
190
git rev-list HEAD --count Git Rev-Liste
Jake Berger
14
@jberger: Ich denke dein Kommentar sollte in eine Antwort umgewandelt werden.
Utapyngo
@utapyngo: Angesichts der 13 anderen Antworten wusste ich, dass es begraben werden würde. Ich habe es dann hier gepostet .
Jake Berger
@jberger, diese Antwort funktioniert nicht für git1.7.0.
Vorac

Antworten:

1160

Um eine Festschreibung Zählung für eine Revision ( HEAD, master, ein Commit Hash):

git rev-list --count <revision>

So erhalten Sie die Commit-Anzahl für alle Zweige:

git rev-list --all --count

Ich empfehle, dies nicht für die Build-ID zu verwenden, aber wenn Sie müssen, ist es wahrscheinlich am besten, die Anzahl für den Zweig zu verwenden, für den Sie erstellen. Auf diese Weise hat dieselbe Revision immer dieselbe Nummer. Wenn Sie die Anzahl für alle Zweige verwenden, kann die Anzahl durch Aktivitäten in anderen Zweigen geändert werden.

Benjamin Atkin
quelle
27
git shortlog | grep -E '^[ ]+\w+' | wc -lWenn Sie die Gesamtzahl erhalten möchten und git shortlog | grep -E '^[^ ]'wenn Sie die Commit-Nummer für jeden Mitwirkenden erhalten möchten.
Skalee
2
Vielen Dank für den Hinweis wc -l. Minimalismus FTW. Ich habe es in meine Antwort aufgenommen.
Benjamin Atkin
17
Diese Lösung ist sowohl hackig (ähnlich dem git log --pretty=format:'' | wc -lin der ursprünglichen Frage angegebenen Ansatz) als auch falsch: Sie können dies sehen, indem Sie die Übereinstimmung umkehren ( git shortlog | grep -Ev '^[ ]+\w+') und feststellen , dass z. B. Commits ohne Nachricht (dh "<keine>") nicht gezählt werden. Die Verwendung git rev-list HEAD --countist sowohl prägnanter als auch genauer.
ctrueden
17
@ BenAtkin: Ich entschuldige mich; Es war nicht meine Absicht, beleidigend zu sein, sondern nur sachlich. Punkt über das Datum der Antwort genommen. Zu diesem Zeitpunkt war Ihre Lösung möglicherweise die beste verfügbare. Aber ich stehe zu meiner Aussage, dass dies git rev-list HEAD --countjetzt eine bessere Lösung ist.
ctrueden
3
Fügte auch eine Antwort hinzu und funktioniert auch mit alten Versionen:git log --oneline | wc -l
Jimmy Kane
155

git shortlog ist eine Möglichkeit.

Rayne
quelle
5
Ty. Dies funktionierte für mich beim Zählen von Commits in einem Bereich. Git Shortlog sha1..sha2
RJFalconer
1
Ja, die erste Zeile des Git-Shortlogs enthält die Anzahl der Commits. Problem gelöst.
Robert Massaioli
5
Die Anzahl der Commits ist nach Committern gruppiert, nicht so gut. Kann Zeilen in Git Shortlog zählen, aber dies funktioniert aus irgendeinem Grund nicht über SSH ohne Terminal (Pager?). Die ursprüngliche Lösung des Fragestellers ist die beste! git log --pretty = format: '' | wc -l
Sam Watkins
4
Ich würde jedoch git rev-list HEAD --counteher den ursprünglichen Ansatz vorschlagen, der im OP angegeben ist. In meinen Tests git log --pretty=format:'' | wc -list um eins aus.
ctrueden
3
@ctrueden git log --oneline | wc -list nicht um eins ausgeschaltet (OS X 10.8.5).
Andy Stewart
111

git rev-list HEAD --count

Git Rev-Liste

git rev-list <commit>: Listen Sie Commits auf, die erreichbar sind, indem Sie den übergeordneten Links des angegebenen Commits folgen (in diesem Fall HEAD ).

--count : Drucken Sie eine Zahl aus, die angibt, wie viele Commits aufgelistet worden wären, und unterdrücken Sie alle anderen Ausgaben.

Jake Berger
quelle
101

Dieser Befehl gibt die Anzahl der nach Committern gruppierten Commits zurück:

git shortlog -s

Ausgabe:

14 John lennon
9  Janis Joplin

Vielleicht möchten Sie wissen, dass das -sArgument die Kontraktionsform von ist --summary.

Alex Pliutau
quelle
11
git shortlogan sich geht nicht auf die ursprüngliche Frage der Gesamtzahl der Commits ein (nicht nach Autor gruppiert). Verwenden Sie git rev-list HEAD --countstattdessen.
ctrueden
5
Genial! Sie können es sortieren , indem | sort -nauch
Mohsen
54

Wenn Sie nach einer eindeutigen und dennoch gut lesbaren Kennung für Commits suchen, ist git description möglicherweise genau das Richtige für Sie.

Bombe
quelle
2
Das könnte funktionieren und wäre einfacher zu bedienen als ein maßgeschneidertes Algo. +1
VonC
2
Ich wusste nicht, wie ich es beschreiben würde. Diese kleine Zahl zwischen dem Tag-Namen und dem sha1 ist genau das, wonach ich gesucht habe. Vielen Dank.
Splo
2
Schauen Sie sich das GIT-VERSION-GEN-Skript an und wie es im Git-Repository und in ähnlichen Skripten in Linux-Kernelquellen verwendet wird (und wie sie in Makefile verwendet werden).
Jakub Narębski
Dies gibt eine eindeutige, aber nicht inkrementelle ID. Funktioniert bei mir nicht Die Antwort von Ben Atkin bietet jedoch eine Commit-Anzahl, die in der Praxis inkrementell sein sollte. Aaron Digullas Antwort ist sicherer, erfordert aber auch mehr Arbeit.
JOM
2
Ja, das liegt daran, dass das Konzept einer inkrementellen ID bei verteilten Versionskontrollsystemen keinen Sinn ergibt.
Bombe
34

Sie sind nicht der erste, der über eine "Revisionsnummer" in Git nachdenkt , aber ' wc' ist ziemlich gefährlich, da Commit gelöscht oder gequetscht werden kann und der Verlauf erneut überprüft wird.

Die "Revisionsnummer" war für Subversion besonders wichtig, da sie im Falle einer Zusammenführung benötigt wurde (SVN1.5 und 1.6 haben sich in dieser Hinsicht verbessert).

Möglicherweise erhalten Sie einen Pre-Commit-Hook, der eine Revisionsnummer in den Kommentar enthält. Bei einem Algorithmus wird nicht der gesamte Verlauf eines Zweigs nachgeschlagen, um die richtige Nummer zu ermitteln.

Bazaar hat tatsächlich einen solchen Algorithmus entwickelt , und er kann ein guter Ausgangspunkt für das sein, was Sie tun möchten.

(Wie Bombes Antwort hervorhebt, hat Git tatsächlich einen eigenen Algorithmus, der auf dem neuesten Tag plus der Anzahl der Commits plus ein bisschen SHA-1-Schlüssel basiert.) Sie sollten seine Antwort sehen (und positiv bewerten), wenn sie für Sie funktioniert.


Um Aarons Idee zu veranschaulichen , können Sie den Git-Commit-Hash auch an die "Info" -Datei einer Anwendung anhängen, die Sie mit Ihrer Anwendung verteilen.

Auf diese Weise würde die About-Box folgendermaßen aussehen:

Über Box

Die anwendbare Nummer ist Teil des Commits, aber die "Info" -Datei der Anwendung wird während des Verpackungsprozesses generiert, wodurch eine anwendbare Build-Nummer effektiv mit einer technischen Revisions- ID verknüpft wird .

VonC
quelle
2
Ich habe mein Skript für die Verwendung mit Xcode 3 aktualisiert. Sie können eine aktuelle Version von gist.github.com/208825 abrufen .
Abizern
34

Sie können nur verwenden:

git shortlog -s -n

Ergebnis:

 827  user one
    15  user two
     2  Gest 
demenvil
quelle
22

Ein einfacher Weg ist:

 git log --oneline | wc -l

oneline versichert dass.

Jimmy Kane
quelle
1
'wc' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt.
user815693
Welches System verwenden Sie? Ist es ein UNIX? /
Jimmy Kane
1
Dies scheint auch schneller zu sein, wenn Sie Tausende von Commits haben. Alle anderen Befehle benötigen zu viel Zeit.
Danny Coulombe
21

Um es in eine Variable zu bringen, ist der einfachste Weg:

export GIT_REV_COUNT=`git rev-list --all --count`
John Gietzen
quelle
5
In git rev-listder Tat ist das richtige Werkzeug zu verwenden, nicht git logwie das andere sagen.
Nayuki
1
So zählen Sie die Anzahl der Commits in der Linie, um HEAD zu erreichen: git rev-list --first-parent | wc -l
200_success
Sie müssen nicht wc -lnur den --countSchalter verwenden : git rev-list --all --count.
Slm
Danke @slm, ich habe die Antwort aktualisiert. Ich vermute jedoch, dass die ursprüngliche Antwort älter ist als der --countSchalter selbst.
John Gietzen
@ JohnGietzen - oh ja, ich dachte mir, dass 8-) nur dieses Detail hinzugefügt hat, um zu helfen.
Slm
17

Git Shortlog ist eine Möglichkeit, die Commit-Details abzurufen:

git shortlog -s -n

Dies gibt die Anzahl der Commits an, gefolgt vom Autorennamen. Mit der Option -s werden alle Festschreibungsnachrichten für jede vom Autor vorgenommene Festschreibung entfernt. Entfernen Sie dieselbe Option, wenn Sie auch die Festschreibungsnachrichten anzeigen möchten. Die Option -n wird zum Sortieren der gesamten Liste verwendet. Hoffe das hilft.

Sri Murthy Upadhyayula
quelle
2
git shortlogan sich geht nicht auf die ursprüngliche Frage der Gesamtzahl der Commits ein (nicht nach Autor gruppiert). Verwenden Sie git rev-list HEAD --countstattdessen.
ctrueden
8

git rev-parse --kurzer KOPF

Makuchaku
quelle
1
Erzeugt einen Hash, während eine Nummer angefordert wurde.
Jesse Glick
4

Wenn Sie nur einen Zweig wie Master verwenden, funktioniert dies meiner Meinung nach hervorragend:

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

Dies gibt nur eine Zahl aus. Sie können es auf so etwas alias

git revno

um die Dinge wirklich bequem zu machen. Bearbeiten Sie dazu Ihre .git/configDatei und fügen Sie diese hinzu:

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

Dies funktioniert unter Windows nicht. Ich kenne das Äquivalent von "wc" für dieses Betriebssystem nicht, aber ein Python-Skript zu schreiben, um das Zählen für Sie durchzuführen, wäre eine plattformübergreifende Lösung.

BEARBEITEN : Zählen Sie zwischen zwei Commits:


Ich suchte nach einer Antwort, die zeigen würde, wie die Anzahl der Commits zwischen zwei willkürlichen Revisionen ermittelt werden kann, und sah keine.

git rev-list --count [older-commit]..[newer-commit]
NuclearPeon
quelle
3

Generieren Sie während des Builds eine Nummer und schreiben Sie sie in eine Datei. Wenn Sie eine Veröffentlichung vornehmen, schreiben Sie diese Datei mit dem Kommentar "Build 147" fest (oder wie auch immer die aktuelle Build-Nummer lautet). Übernehmen Sie die Datei nicht während der normalen Entwicklung. Auf diese Weise können Sie in Git problemlos zwischen Build-Nummern und Versionen zuordnen.

Aaron Digulla
quelle
Wenn zwei verteilte Entwickler dies tun würden, würden ihre Build-Nummern dann nicht regelmäßig kollidieren / sich überschneiden? Was wäre, wenn beide einen Build zwischen denselben Umdrehungen eines gemeinsam genutzten Repos durchführen würden oder eine Kollision nur dann auftreten würde, wenn beide Änderungen nicht für das gemeinsam genutzte Repo übernommen worden wären? Nicht sicher.
Kochfelder
Sicher, aber der Konflikt sagt Ihnen, was zu tun ist: Sprechen Sie einfach mit dem anderen oder verwenden Sie immer eine höhere Nummer. Denken Sie daran: Eine Zahl kann einen fehlerhaften Build-Prozess nicht auf magische Weise heilen. Es ist nur eine Erinnerung oder ein Hinweis, dass Sie etwas überprüfen müssen.
Aaron Digulla
1
Ahh, ja, die magische Datei buildno.txt wird zusammen mit dem Rest festgeschrieben. Guter Ansatz für ein kleines Team oder ein großes Team, das parallele Builds vermeidet. Ich kann mir nur vorstellen, dass es möglicherweise nicht so gut funktioniert, wenn ein großes Team eine Skriptsprache (Python) verwendet, für die kein Erstellungsprozess erforderlich ist (um eine einzelne Person für das Erstellen zuzuweisen).
Kochfelder
3

In unserer Firma sind wir von SVN zu Git gewechselt. Das Fehlen von Revisionsnummern war ein großes Problem!

Tun Sie dies git svn cloneund kennzeichnen Sie das letzte SVN-Commit mit seiner SVN-Revisionsnummer:

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

Dann können Sie die Revisionsnummer mit Hilfe von erhalten

git describe --tags --long

Dieser Befehl gibt so etwas wie:

7603-3-g7f4610d

Mittel: Das letzte Tag ist 7603 - es ist die SVN-Revision. 3 - ist die Anzahl der Commits davon. Wir müssen sie hinzufügen.

Die Revisionsnummer kann also mit diesem Skript gezählt werden:

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

Die, die ich verwendet habe, war:

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

Einfach, aber es hat funktioniert.

Robert Massaioli
quelle
4
Es dauert eine Commit-Nachrichtenzeile, die mit "Commit" beginnt, um die Anzahl zu unterbrechen. Zum Beispiel: "Korrigierte Fehler und fehlerhafte Tests, die ich versehentlich in den letzten \ ncommit hineingeschoben habe"
Paweł Polewicz
1

Verwenden der Bash-Syntax,

$(git rev-list --count HEAD)

sieht gut aus für rein lineare Geschichte. Wenn Sie manchmal auch "Zahlen" aus Zweigen haben möchten (basierend auf master), beachten Sie:

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

Wenn Sie von einer Kasse aus laufen master, erhalten Sie einfach 1234.0oder dergleichen. Wenn Sie von einer Kasse eines Zweigs ausgeführt werden, erhalten Sie so etwas wie 1234.13, wenn 13 Commits für diesen Zweig vorgenommen wurden. Offensichtlich ist dies nur insofern nützlich, als Sie höchstens einen Zweig von einem bestimmten abstellenmaster Revision zugrunde legen.

--first-parent könnte zur Mikronummer hinzugefügt werden, um einige Commits zu unterdrücken, die nur durch das Zusammenführen anderer Zweige entstehen, obwohl dies wahrscheinlich nicht erforderlich ist.

Jesse Glick
quelle
1

Du kannst es versuchen

git log --oneline | wc -l

oder um alle Commits aufzulisten, die von den im Repository beitragenden Personen ausgeführt wurden

git shortlog -s

quelle
1

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

Wenn Sie dies zu Ihrer Konfiguration hinzufügen, können Sie einfach auf den Befehl verweisen.

git count

Robert Pounder
quelle
0

Verwenden Sie git shortlog einfach so

git shortlog -sn

Oder erstellen Sie einen Alias ​​(für ZSH-basiertes Terminal)

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

Ahmad Awais
quelle
0

Wie wäre es mit einem alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
Rost
quelle