Policz liczbę zatwierdzeń w oddziale Git

184

Znalazłem już tę odpowiedź: liczba zatwierdzeń w gałęzi w git, ale zakłada się, że gałąź została utworzona z master.

Jak mogę policzyć liczbę zatwierdzeń wzdłuż gałęzi bez polegania na tym założeniu?

W SVN jest to banalne, ale z jakiegoś powodu naprawdę trudno jest to rozgryźć w git.

aaronbauman
źródło
1
możliwy duplikat liczby zatwierdzeń w oddziale w git
endrigoantonini

Odpowiedzi:

349

Aby policzyć zatwierdzenia dla oddziału, w którym się znajdujesz:

git rev-list --count HEAD

dla oddziału

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

Jeśli chcesz policzyć zatwierdzenia w gałęzi, które są dokonywane od czasu utworzenia gałęzi

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

Spowoduje to policzenie wszystkich zatwierdzeń, które kiedykolwiek zostały wykonane, a których nie ma również w nazwie oddziału.

Przykłady

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

Wynik: 3

Jeśli twoja gałąź pochodzi z gałęzi o nazwie develop:

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

Wynik: 3

Ignorowanie połączeń

Jeśli scalisz inną gałąź w bieżącą gałąź bez szybkiego przewijania do przodu i zrobisz powyższe, scalanie jest również liczone. Dzieje się tak, ponieważ dla git scalenie jest zatwierdzeniem.

Jeśli nie chcesz liczyć tych zatwierdzeń, dodaj --no-merges:

git rev-list --no-merges --count HEAD ^develop
Peter van der Does
źródło
7
żadne z nich nie pokazuje poprawnej liczby, na przykład nazwa główna i nazwa gałęzi pokazują taką samą liczbę zatwierdzeń.
botbot
Komentarze nie; naprawdę pozwalają na kod, ale powinno to pokazać, że działa. ==== $ 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 Dodaj . ==== $ 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
Zgadzam się z @botbot. To nie są naprawdę dokładne. Na przykład spróbuj dodać kilka zatwierdzeń scalania lub pull / rebase i zauważ, że liczby przedstawione powyżej stają się niewiarygodne.
Wil Moore III,
2
@wilmoore Masz na myśli, że dostaniesz dodatkową liczbę po scaleniu oddziału? Jest to technicznie zatwierdzenie, więc jest liczone. ale jeśli nie chcesz liczyć tych zatwierdzeń, dodaj --no-scala. Zaktualizuję odpowiedź.
Peter van der Does
2
rev-list - flaga licznika nie istnieje w git 1.7. W tej chwili poniższe niżej wymienione sugestie dotyczące działania w dół do piekła git logdziałają lepiej niż jakiekolwiek inne sugestie.
aaronbauman
60

Aby zobaczyć całkowitą liczbę zatwierdzeń, możesz zrobić tak, jak sugerował Peter powyżej

git rev-list --count HEAD

A jeśli chcesz zobaczyć liczbę zatwierdzeń dokonanych przez każdą osobę, wypróbuj ten wiersz

git shortlog -s -n

wygeneruje takie wyjście

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi
Asnad Atta
źródło
3
jakie są te liczby przed imionami? możesz wytłumaczyć ?
Ciasto piekarz
5
@Ciastopiekarz to liczba zatwierdzeń przez każdą osobę.
Asnad Atta
39

Może wymagać stosunkowo nowej wersji Git, ale działa to dla mnie dobrze:

git rev-list --count develop..HEAD

Daje mi to dokładną liczbę zatwierdzeń w bieżącej gałęzi opartej na master.

Polecenie w odpowiedzi Piotra git rev-list --count HEAD ^developzawiera wiele innych zatwierdzeń, 678 vs 97 w moim obecnym projekcie.

Moja historia zatwierdzeń jest liniowa w tej gałęzi, więc YMMV, ale daje mi dokładnie taką odpowiedź, jakiej potrzebowałem, a mianowicie „Ile zatwierdzeń dodałem do tej pory w tej gałęzi funkcji?”.

skąpy
źródło
Powinno być tak samo. Dokumenty tak mówią . 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
Jestem zmieszany: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;nie ustawia się w kolejce. BEHIND jest jak 1800, kiedy w rzeczywistości nic więcej niż połączenie w górę / w górę ~ 400 powoduje zmiany. użycie --no-mergesnie jest dużo lepsze, daje jak 900. A jeśli zrobię takie scalenie z ~ 800, a liczba obrotów na liście to 1800, to zrobię scalenie z ~ 790, uzyskuję od 6 do 28 niższą liczbę obrotów -lista.
dlamblin
7

Ile zatwierdzeń wykonano dla bieżącego oddziału od początku historii, nie licząc zatwierdzeń z połączonych oddziałów:

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

Z dokumentacji git rev-list - pomoc :

--first-parent

Śledź tylko pierwszy zatwierdzenie nadrzędne po zobaczeniu zatwierdzenia scalania. Ta opcja może dać lepszy przegląd podczas przeglądania ewolucji konkretnej gałęzi tematu, ponieważ scalanie w gałęzi tematu zwykle polega wyłącznie na dostosowywaniu się do zaktualizowanych wcześniejszych wersji, a ta opcja pozwala zignorować poszczególne zatwierdzenia wprowadzone do twoją historię przez takie połączenie. Nie można łączyć z --bisect.

Uwaga: Płytki klon zmniejszy rozmiar historii. Np. Jeśli sklonujesz --depth 1, zwróci 1.

liczba zatwierdzeń wykonanych od czasu innych zatwierdzeń:

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

lub to samo:

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

lub użyj dowolnego innego odniesienia git :

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

Policz zobowiązania wykonane od 2018 roku

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

01-01-2018, 01.01.2018, 2018.01.01 również działa.


git rev-label

Napisałem skrypt, aby uzyskać wersję Git w formacie podobnym do tego, '$refname-c$count-g$short$_dirty'który się rozwija master-c137-gabd32ef.
Dołączono pomoc do samego skryptu.

kyb
źródło
git rev-list abc0923f .. --count - pierwszy rodzic daje odpowiednie wyniki dla mojej gałęzi, ale pierwsze polecenie daje dużą wartość
Jiss Raphel
5

Co powiesz na git log --pretty=oneline | wc -l

To powinno liczyć wszystkie zatwierdzenia z perspektywy twojego aktualnego oddziału.

Remear
źródło
Którą kolumnę liczysz? Czy to pierwszy?
Hengjie
3

Lubię robić git shortlog -s -n --all. Daje ci listę nazw i liczby zatwierdzeń w stylu „liderów”.

inorganik
źródło
2

Jednym ze sposobów na to jest wyświetlenie dziennika dla oddziału i policz linie.

git log <branch_name> --oneline | wc -l
kjw0188
źródło
1

Cóż, wybrana odpowiedź nie działa, jeśli rozwidliłeś swoją gałąź z nieokreślonej gałęzi (tj. Nie masterlub develop).

Tutaj oferuję inny sposób, którego używam w moich pre-pushhaczykach do gitów.

# 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

Aby uzyskać więcej analiz, odwiedź mój blog

Paul Lan
źródło
1

Ponieważ OP odnosi się do liczby zatwierdzeń na gałęzi w git , chcę dodać, że podane tam odpowiedzi działają również z każdym innym oddziałem, przynajmniej od wersji git 2.17.1 (i wydaje się bardziej wiarygodne niż odpowiedź Petera van der Does):

działa poprawnie:

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

Ostatnie polecenie daje zero zatwierdzeń zgodnie z oczekiwaniami, ponieważ właśnie utworzyłem gałąź. Powyższe polecenie podaje mi rzeczywistą liczbę zatwierdzeń w mojej gałęzi programistycznej minus scalenie-zatwierdzenia

nie działa poprawnie:

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

W obu przypadkach otrzymuję liczbę wszystkich zatwierdzeń w gałęzi programistycznej i master, z której gałęzie (pośrednio) pochodzą.

sdoe
źródło
1

Jeśli używasz systemu UNIX, możesz to zrobić

git log|grep "Author"|wc -l
około
źródło
-2

Możesz także zrobić git log | grep commit | wc -l

i odzyskaj wynik

James
źródło
1
To nie jest wiarygodne. Na przykład pasowałby do zatwierdzeń, które mają „zatwierdzenie” w komunikacie zatwierdzenia dwukrotnie.
rdb
@rdb Nie, nie będzie. Wyświetli tylko liczbę wierszy zawierających słowo „zatwierdzenie”, więc jeden wiersz nigdy nie zostanie policzony dwukrotnie.
iBug
@ iBug: Brakuje Ci sensu. Jeśli komunikat zatwierdzenia zawiera słowo „zatwierdzenie”, pojawia się w osobnym wierszu od wiersza „zatwierdzenia a1b2c ...” na git logwyjściu, więc zatwierdzenie zostanie policzone dwukrotnie w wyniku. Jeszcze gorzej, jeśli komunikat zatwierdzenia miałby zawierać słowo „zatwierdzić” dwa razy w dwóch osobnych wierszach.
rdb