Zählen Sie die Anzahl der Commits in einem Git-Zweig

184

Ich habe diese Antwort bereits gefunden: Anzahl der Commits für den Zweig in git, aber das setzt voraus, dass der Zweig vom Master erstellt wurde.

Wie kann ich die Anzahl der Commits entlang eines Zweigs zählen, ohne mich auf diese Annahme zu verlassen?

In SVN ist dies trivial, aber aus irgendeinem Grund ist es wirklich schwierig, es in Git herauszufinden.

Aaronbauman
quelle
1
mögliches Duplikat der Anzahl der Commits auf Zweig in git
endrigoantonini

Antworten:

349

So zählen Sie die Commits für den Zweig, in dem Sie sich befinden:

git rev-list --count HEAD

für einen Zweig

git rev-list --count <branch-name>

Wenn Sie die Commits für einen Zweig zählen möchten, die seit dem Erstellen des Zweigs vorgenommen wurden

git rev-list --count HEAD ^<branch-name>

Dies zählt alle jemals getätigten Commits, die nicht auch im Filialnamen enthalten sind.

Beispiele

git checkout master
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^master

Ergebnis: 3

Wenn Ihre Niederlassung aus einer Niederlassung mit dem Namen stammt develop:

git checkout develop
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^develop

Ergebnis: 3

Zusammenführungen ignorieren

Wenn Sie einen anderen Zweig ohne schnellen Vorlauf in den aktuellen Zweig einbinden und die oben genannten Schritte ausführen, wird auch die Zusammenführung gezählt. Dies liegt daran, dass für git eine Zusammenführung ein Commit ist.

Wenn Sie diese Commits nicht zählen möchten, fügen Sie Folgendes hinzu --no-merges:

git rev-list --no-merges --count HEAD ^develop
Peter van der Does
quelle
7
Keiner von diesen zeigt die richtige Nummer an, zum Beispiel zeigen Master und Branchname die gleiche Anzahl von Commits.
Botbot
Kommentare erlauben keinen Code, aber dies sollte zeigen, dass es funktioniert. ==== $ git init ==== $ touch test.txt ==== $ git add. ==== $ git commit -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list --count master => 1 ==== $ git checkout -b test ==== $ git rev-list --count test => 1 ==== $ git rev-list --count HEAD ^ master => 0 ==== $ touch test2.txt ==== $ git hinzufügen . ==== $ git commit -a ==== $ git rev-list --count master => 1 ==== $ git rev-list --count test => 2 ==== $ git rev-list --count HEAD ^ master => 1 ====
Peter van der Does
1
Ich stimme @botbot zu. Diese sind nicht wirklich genau. Versuchen Sie beispielsweise, einige Merge-Commits oder Pull / Rebase hinzuzufügen, und stellen Sie fest, dass die oben dargestellten Zählungen unzuverlässig werden.
Wil Moore III
2
@wilmoore Du meinst, dass du nach dem Zusammenführen eines Zweigs eine zusätzliche Anzahl bekommst? Dies ist technisch gesehen ein Commit und wird daher gezählt. Wenn Sie diese Commits jedoch nicht zählen möchten, fügen Sie --no-merges hinzu. Ich werde die Antwort aktualisieren.
Peter van der Does
2
rev-list --count flag existiert in git 1.7 nicht. Im Moment git logfunktionieren die unten aufgeführten Vorschläge zur Hölle besser als alle anderen Vorschläge.
Aaronbauman
60

Um die Anzahl der Commits zu sehen, können Sie die oben von Peter vorgeschlagenen Schritte ausführen

git rev-list --count HEAD

Wenn Sie die Anzahl der von jeder Person vorgenommenen Commits anzeigen möchten, versuchen Sie diese Zeile

git shortlog -s -n

erzeugt eine Ausgabe wie diese

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi
Asnad Atta
quelle
3
Was sind diese Zahlen vor Namen? können Sie erklären ?
Ciasto Piekarz
5
@Ciastopiekarz Dies ist die Anzahl der Commits von jeder Person.
Asnad Atta
39

Möglicherweise ist eine relativ neue Version von Git erforderlich, aber das funktioniert gut für mich:

git rev-list --count develop..HEAD

Dies gibt mir eine genaue Anzahl von Commits in der aktuellen Verzweigung, deren Basis auf Master basiert.

Der Befehl in Peters Antwort git rev-list --count HEAD ^developenthält viele weitere Commits, 678 vs 97 für mein aktuelles Projekt.

Mein Commit-Verlauf ist in diesem Zweig linear, also YMMV, aber es gibt mir die genaue Antwort, die ich wollte: "Wie viele Commits habe ich bisher in diesem Feature-Zweig hinzugefügt?".

scanny
quelle
Sollte das gleiche sein. Die Dokumentation sagt es . A special notation "<commit1>..<commit2>" can be used as a short-hand for "^'<commit1>' <commit2>". For example, either of the following may be used interchangeably: $ git rev-list origin..HEAD $ git rev-list HEAD ^origin
Dosentmatter
Ich bin verwirrt: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;steht nicht an. HINTER ist wie 1800, wenn in Wirklichkeit nichts Größeres als das Zusammenführen von Upstream / Master ~ 400 Änderungen hervorruft. Verwenden --no-mergesist nicht viel besser, gibt wie 900. Und wenn ich eine Zusammenführung wie diese mit ~ 800 mache und die Anzahl der Umdrehungslisten 1800 ist, dann mache ich eine Zusammenführung mit ~ 790, ich bekomme zwischen 6 und 28 niedrigere Anzahl in Umdrehungen -aufführen.
Dlamblin
7

Wie viel Commits wurden für den aktuellen Zweig seit Beginn der Geschichte durchgeführt, ohne Commits von zusammengeführten Zweigen:

git rev-list HEAD --count --first-parent

Aus der Dokumentation git rev-list --help :

--first-parent

Befolgen Sie nur das erste übergeordnete Commit, wenn ein Merge-Commit angezeigt wird. Diese Option bietet einen besseren Überblick beim Anzeigen der Entwicklung eines bestimmten Themenzweigs, da beim Zusammenführen in einen Themenzweig in der Regel nur von Zeit zu Zeit eine Aktualisierung auf den Upstream vorgenommen wird. Mit dieser Option können Sie die einzelnen eingebrachten Commits ignorieren Ihre Geschichte durch eine solche Verschmelzung. Kann nicht mit --bisect kombiniert werden.

Hinweis: Flacher Klon verkleinert die Verlaufsgröße. Wenn Sie beispielsweise mit klonen --depth 1, wird 1 zurückgegeben.

Anzahl der seit einem anderen Commit durchgeführten Commits:

git rev-list HEAD abc0923f --count --first-parent

oder das gleiche:

git rev-list abc0923f.. --count --first-parent

oder verwenden Sie eine andere Git-Referenz :

git rev-list master tag-v20 --count --first-parent

Count Commits seit 2018 durchgeführt

git rev-list HEAD --count --first-parent --since=2018-01-01

01-01-2018, 01.01.2018, 2018.01.01 funktioniert auch.


git rev-label

Ich habe ein Skript geschrieben, um eine Versionsrevision von Git in einem Format zu erhalten, '$refname-c$count-g$short$_dirty'das sich erweitert master-c137-gabd32ef.
Das Skript selbst enthält Hilfe.

kyb
quelle
git rev-list abc0923f .. --count --first-parent gibt korrekte Ergebnisse für meinen Zweig, aber der erste Befehl gibt einen großen Wert
Jiss Raphel
5

Wie wäre es mit git log --pretty=oneline | wc -l

Das sollte alle Commits aus der Sicht Ihrer aktuellen Niederlassung zählen.

Remear
quelle
Welche Spalte zählst du? Ist es der erste?
Hengjie
3

Ich mache gerne git shortlog -s -n --all. Gibt Ihnen eine Liste mit Namen und Anzahl der Commits im "Leaderboard" -Stil.

anorganik
quelle
2

Eine Möglichkeit besteht darin, das Protokoll für Ihren Zweig aufzulisten und die Zeilen zu zählen.

git log <branch_name> --oneline | wc -l
kjw0188
quelle
1

Nun, die ausgewählte Antwort funktioniert nicht, wenn Sie Ihren Zweig aus einem unspezifischen Zweig herausgegabelt haben (dh nicht masteroder develop).

Hier biete ich eine andere Möglichkeit an, die ich in meinen pre-pushGit-Hooks verwende.

# Run production build before push
echo "[INFO] run .git/hooks/pre-push"

echo "[INFO] Check if only one commit"

# file .git/hooks/pre-push
currentBranch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

gitLog=$(git log --graph --abbrev-commit --decorate  --first-parent HEAD)

commitCountOfCurrentBranch=0
startCountCommit=""
baseBranch=""

while read -r line; do

    # if git log line started with something like "* commit aaface7 (origin/BRANCH_NAME)" or "commit ae4f131 (HEAD -> BRANCH_NAME)"
    # that means it's on our branch BRANCH_NAME

    matchedCommitSubstring="$( [[ $line =~ \*[[:space:]]commit[[:space:]].*\((.*)\) ]] && echo ${BASH_REMATCH[1]} )"

    if [[ ! -z ${matchedCommitSubstring} ]];then

      if [[  $line =~ $currentBranch ]];then
        startCountCommit="true"
      else
        startCountCommit=""

        if [[ -z ${baseBranch} ]];then
          baseBranch=$( [[ ${matchedCommitSubstring} =~ (.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${matchedCommitSubstring} )

        fi

      fi

    fi


    if [[ ! -z ${startCountCommit} && $line =~ ^\*[[:space:]]commit[[:space:]] ]];then
      ((commitCountOfCurrentBranch++))
    fi


done <<< "$gitLog"

if [[ -z ${baseBranch} ]];then

  baseBranch="origin/master"

else

  baseBranch=$( [[ ${baseBranch} =~ ^(.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${baseBranch} )

fi


echo "[INFO] Current commit count of the branch ${currentBranch}:  ${commitCountOfCurrentBranch}"

if [[ ${commitCountOfCurrentBranch} -gt 1 ]];then
  echo "[ERROR] Only a commit per branch is allowed. Try run 'git rebase -i ${baseBranch}'"
  exit 1
fi

Für weitere Analysen besuchen Sie bitte meinen Blog

Paul Lan
quelle
1

Da das OP auf die Anzahl der Commits für den Zweig in git verweist, möchte ich hinzufügen, dass die dort gegebenen Antworten auch mit jedem anderen Zweig funktionieren, zumindest seit git Version 2.17.1 (und scheinbar zuverlässiger als die Antwort von Peter van der Does):

richtig funktionieren:

git checkout current-development-branch
git rev-list --no-merges --count master..
62
git checkout -b testbranch_2
git rev-list --no-merges --count current-development-branch..
0

Der letzte Befehl gibt erwartungsgemäß keine Commits aus, da ich gerade den Zweig erstellt habe. Der vorherige Befehl gibt mir die tatsächliche Anzahl der Commits in meinem Entwicklungszweig abzüglich der Merge-Commits an.

funktioniert nicht richtig:

git checkout current-development-branch
git rev-list --no-merges --count HEAD
361
git checkout -b testbranch_1
git rev-list --no-merges --count HEAD
361

In beiden Fällen erhalte ich die Anzahl aller Commits im Entwicklungszweig und Master, von denen die Zweige (indirekt) abstammen.

sdoe
quelle
1

Wenn Sie ein UNIX-System verwenden, können Sie dies tun

git log|grep "Author"|wc -l
zirka
quelle
-2

Sie können auch Git Log | machen grep commit | wc -l

und das Ergebnis zurückbekommen

James
quelle
1
Dies ist nicht zuverlässig. Es würde beispielsweise zweimal mit Commits übereinstimmen, deren Commit-Nachricht "Commit" enthält.
Rdb
@rdb Nein, wird es nicht. Es wird nur die Anzahl der Zeilen ausgegeben , die das Wort "Festschreiben" enthalten, sodass eine Zeile niemals zweimal gezählt wird.
iBug
@ iBug: Du verpasst den Punkt. Wenn die Festschreibungsnachricht das Wort "Festschreiben" enthält, wird sie in einer separaten Zeile von der Zeile "Festschreiben a1b2c ..." in der git logAusgabe angezeigt , sodass das Festschreiben im Ergebnis zweimal gezählt wird. Noch schlimmer, wenn die Festschreibungsnachricht das Wort "Festschreiben" zweimal in zwei separaten Zeilen enthalten sollte.
Rdb