it-swarm.com.de

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

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

Wie kann ich die Anzahl der Commits in einem Zweig zählen, ohne auf diese Annahme zu setzen?

In SVN ist dies trivial, aber aus irgendeinem Grund ist es wirklich schwer in git herauszufinden.

112
aaronbauman

Um die Commits für die Zweigstelle zu zählen, in der 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>

Dadurch werden alle Commits gezählt, die auch nicht auf dem Zweignamen stehen.

Beispiele

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

Ergebnis: 3

Wenn Ihr Zweig aus einem Zweig namens develop stammt:

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

Ergebnis: 3

Merges ignorieren

Wenn Sie einen anderen Zweig ohne schnellen Vorlauf in den aktuellen Zweig einführen und dies tun, wird die Zusammenführung ebenfalls gezählt. Dies liegt daran, dass für git eine Verschmelzung ein Commit ist.

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

git rev-list --no-merges --count HEAD ^develop
226

diese Linie

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
45
Asnad Atta

Es kann eine relativ neue Version von Git erforderlich sein, aber das funktioniert gut für mich:

git rev-list --count develop..HEAD

Dies gibt mir eine genaue Anzahl von Commits in der aktuellen Branche, die auf Master basiert.

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

Meine Commit-Historie ist in diesem Zweig linear, so YMMV, aber es gibt mir genau die Antwort, die ich wollte, nämlich "Wie viele Commits habe ich bisher in diesem Feature-Zweig hinzugefügt?".

28
scanny

Ich mag git shortlog -s -n --all. Gibt Ihnen eine Liste mit Namen und Anzahl der Commits in der "Bestenliste".

3
inorganik

Wie viele Commits wurden seit Beginn der Historie für die aktuelle Branche gemacht, wobei Commits aus zusammengeführten Zweigen nicht mitgezählt werden:

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

Aus der Dokumentation git rev-list --help:

--first-parent 

Folgen Sie nur dem ersten übergeordneten Commit, wenn Sie einen Merge-Commit sehen. Diese Option kann einen besseren Überblick bieten, wenn Sie die Entwicklung eines bestimmten Zweigzweigs betrachten, da beim Zusammenführen in einen Zweigzweig von Zeit zu Zeit nur Upstream-Aktualisierungen vorgenommen werden müssen. Mit dieser Option können Sie die einzelnen eingegebenen Commits ignorieren Ihre Geschichte durch eine solche Verschmelzung. Kann nicht mit --bisect kombiniert werden.

Anzahl der seit anderen Commits durchgeführten Commits:

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

oder das gleiche:

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

oder verwende eine andere git Referenz :

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

Hinweis: Shallow Clone verkleinert die Protokollgröße. Z.B. Wenn Sie mit --depth 1 klonen, wird 1 zurückgegeben. 


Anzahl Festschreibungen seit 2018

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

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


git revision

Ich habe ein Skript geschrieben, um eine Versionsversion von Git im Format '$refname-c$count-g$short$_dirty' zu erhalten, das zu master-c137-gabd32ef erweitert wird.
Die Hilfe ist im Skript selbst enthalten.

installation

cd ~/bin
wget 'https://gitlab.com/kyb/build-info-header/raw/master/git-revision.sh?inline=false' -qO git-revision.sh  &&  chmod +x git-revision.sh
ln -s $PWD/git-revision.sh /usr/local/bin/git-revision

verwendungszweck

git revision
git revision '$refname-c$count-g$short$_dirty'
3
kyb

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

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

2
Remear

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
1
kjw0188

Die gewählte Antwort funktioniert nicht, wenn Sie Ihren Zweig aus einem unspezifischen Zweig herausgearbeitet haben (d. H. Nicht master oder develop). 

Hier biete ich eine andere Möglichkeit an, die ich in meinen pre-Push Git-Haken 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 mein Blog

0
Paul Lan

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

richtig arbeiten:

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äß null Commits aus, da ich gerade den Zweig erstellt habe. Der Befehl zuvor gibt mir die tatsächliche Anzahl von Commits in meinem Entwicklungszweig abzüglich der Merge-Commits.

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.

0
sdoe