Git dalındaki taahhütlerin sayısını sayma


Yanıtlar:


351

Bulunduğunuz şubenin taahhütlerini saymak için:

git rev-list --count HEAD

bir şube için

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

Şubeyi oluşturduğunuzdan bu yana yapılan bir daldaki taahhütleri saymak istiyorsanız

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

Bu, şimdiye kadar şube adına olmayan tüm taahhütleri sayar.

Örnekler

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

Sonuç: 3

Şubeniz şu adlı bir şubeden geliyorsa develop:

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

Sonuç: 3

Birleştirmeleri Yok Sayma

Geçerli dalda başka bir dalı hızlı ileri sarmadan birleştirirseniz ve yukarıdakileri yaparsanız, birleştirme de sayılır. Bunun nedeni git için bir birleştirme işlemidir.

Bu taahhütleri saymak istemiyorsanız şunu ekleyin --no-merges:

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

7
bunların hiçbiri doğru numarayı göstermez, örneğin ana ve şube adı aynı sayıda işi gösterir.
botbot

Yorumlar gerçekten kodlara izin vermez, ancak bu işe yaradığını göstermelidir. ==== $ git init ==== $ test.txt'ye dokunun ==== $ git ekleyin. ==== $ git taahhüt -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list --count master => 1 ==== $ git check--b test ==== $ git rev-list - sayı test => 1 ==== $ rev rev-list --count KAFA ^ master => 0 ==== $ dokunma test2.txt ==== $ git Ekle . ==== $ git taahhüt -a ==== $ git rev-list --count master => 1 ==== $ git rev-list --count test => 2 ==== $ git rev-list --count KAFA ^ master => 1 ====
Peter van der Does

1
@Botbot ile hemfikirim. Bunlar gerçekten doğru değil. Örneğin, bazı birleştirme taahhütleri eklemeyi deneyin veya çekin / yeniden taban atın ve yukarıda gösterilen sayıların güvenilmez hale geldiğini fark edin.
Wil Moore III

2
@wilmoore Yani bir şubeyi birleştirdikten sonra fazladan bir sayım var mı? Bu teknik olarak bir taahhüttür ve bu nedenle sayılır. ancak bu taahhütleri saymak istemiyorsanız --no-merges ekleyin. Cevabı güncelleyeceğim.
Peter van der

2
rev-list --count bayrağı git 1.7'de mevcut değil. Şu anda, aşağıda kullanılan aşağı cehennem önerileri git logdiğer önerilerden daha iyi çalışıyor.
aaronbauman

60

Peter'ın yukarıda önerdiği gibi yapabileceğiniz toplam taahhüt sayısını görmek için

git rev-list --count HEAD

Ve eğer her bir kişi tarafından yapılan taahhüt sayısını görmek istiyorsanız, bu satırı deneyin

git shortlog -s -n

böyle bir çıktı üretecek

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi

3
isimlerden önce bu numaralar nelerdir? açıklayabilir misin ?
Ciasto piekarz

5
@ Ciastopiekarz bunlar her bireyin taahhüt sayısıdır.
Asnad Atta

39

Git'in nispeten yeni bir sürümünü gerektirebilir, ancak bu benim için iyi çalışıyor:

git rev-list --count develop..HEAD

Bu bana mevcut branşta üsse sahip kesin taahhütlerin sayısını verir.

Peter'ın cevabındaki komut, git rev-list --count HEAD ^developmevcut projemde 678'e 97'ye daha fazla taahhüt içeriyor.

Taahhüt geçmişim bu dalda doğrusal, bu yüzden YMMV, ama bana istediğim kesin cevabı veriyor, yani "Bu özellik dalına şimdiye kadar kaç taahhüt ekledim?".


Aynı olmalı. Docs öyle diyor . 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

Kafam karıştı: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;sıraya girmiyor. GERÇEK 1800 gibi, gerçekte akış yukarı / master ~ 400'den büyük bir değişiklik değişmediğinde. Kullanmak --no-mergesçok daha iyi değil, 900 gibi verir. Ve eğer ~ 800 ile böyle bir birleştirme yaparsam ve rev-list sayısı 1800 ise, o zaman ~ 790 ile birleştirme yaparım. -liste.
dlamblin

7

Tarihin başlangıcından bu yana mevcut şubeye ne kadar taahhüt yapılmıştır, birleştirilmiş şubelerden taahhütleri saymaz:

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

Belgelerden git rev-list --help :

--first-parent

Birleştirme taahhüdünü gördüğünüzde yalnızca ilk ebeveyn taahhüdünü izleyin. Bu seçenek, belirli bir konu dalının evrimini görüntülerken daha iyi bir genel bakış sunabilir, çünkü bir konu dalına birleştirmeler yalnızca zaman zaman yukarı akış yönünde güncellenmeye ayarlamakla ilgilidir ve bu seçenek, getirilen bireysel taahhütleri göz ardı etmenize izin verir. böyle bir birleşme ile geçmişinizi. --Bisect ile birleştirilemez.

Not: Sığ klon geçmiş boyutunu küçültür. Örneğin --depth 1, klonlanırsanız 1 döndürür.

diğer bazı taahhütlerden bu yana yapılan taahhütlerin sayısı :

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

ya da aynı:

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

veya başka bir git başvurusu kullanın :

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

Sayım kaydedilmesini 2018 yıldan bu yana yapılan

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

01-01-2018, 01.01.2018, 2018.01.01 de çalışır.


git rev-label

Git'ten '$refname-c$count-g$short$_dirty'genişleyen biçimde sürüm revizyonunu almak için bir komut dosyası yazdım master-c137-gabd32ef.
Komut dosyasının kendisine yardım dahildir.


git rev-list abc0923f .. --count --first-parent şubem için uygun sonuçlar veriyor ancak ilk komut büyük bir değer veriyor
Jiss Raphel

5

Peki ya git log --pretty=oneline | wc -l

Bu, tüm şubeleri mevcut şubenizin perspektifinden saymalıdır.


Hangi sütunu sayıyorsunuz? İlk mi?
Hengjie

3

Yapmayı seviyorum git shortlog -s -n --all. Size bir "büyük şerit" tarzı ad listesi ve taahhüt sayısı verir.


2

Bunu yapmanın bir yolu da şubenizin günlüğünü listelemek ve satırları saymaktır.

git log <branch_name> --oneline | wc -l

1

Eh, seçilen yanıt, spesifik olmayan şube (yani değil senin şube dışarı çatallı eğer çalışma yapmaz masterya develop).

Burada pre-pushgit kancalarımda başka bir yol kullanıyorum .

# 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

Daha fazla analiz için lütfen blogumu ziyaret edin


1

OP referansları olarak Git'teki daldaki taahhütlerin sayısı olarak verilen cevapların, en azından git versiyon 2.17.1'den (ve Peter van der Does'ın cevabından daha güvenilir görünüyor gibi) başka bir dalla da çalıştığını eklemek istiyorum:

düzgün çalışıyor:

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

Son komut, dalı yeni oluşturduğumdan beri beklendiği gibi sıfır işlem veriyor. Daha önceki komut bana, geliştirme şubemdeki birleştirme-taahhüt (ler) i ekleyerek gerçek taahhüt sayısını veriyor

düzgün çalışmıyor:

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

Her iki durumda da, geliştirme dalındaki tüm taahhütlerin sayısını ve dalların (dolaylı olarak) indiği master'ı alıyorum.



-2

Ayrıca git log | grep taahhüdü | wc -l

ve sonucu geri al


1
Bu güvenilir değil. Örneğin, taahhüt mesajında ​​iki kez "taahhüt" olan taahhütlerle eşleşir.
rdb

@rdb Hayır olmayacak. Yalnızca "taahhüt" kelimesini içeren satırların sayısını verir , bu nedenle bir satır iki kez sayılmaz.
18'de iBug

@ iBug: Konuyu kaçırıyorsun. Teslim mesajı "kesin" kelimesini içeriyorsa, çıktıdaki "kesin a1b2c ..." satırından ayrı bir satırda görünür git log, böylece kesinleştirme sonuçta iki kez sayılır. Taahhüt mesajı iki ayrı satırda iki kez "kesin" kelimesini içerecek olsaydı daha da kötüsü.
rdb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.