Hitung jumlah komit pada cabang Git

184

Saya sudah menemukan jawaban ini: Jumlah komit pada cabang di git tetapi itu mengasumsikan bahwa cabang dibuat dari master.

Bagaimana saya bisa menghitung jumlah komit di sepanjang cabang tanpa mengandalkan asumsi itu?

Dalam SVN ini sepele, tetapi untuk beberapa alasan sangat sulit untuk mengetahui di git.

aaronbauman
sumber
1
kemungkinan rangkap dari Jumlah komitmen pada cabang di git
endrigoantonini

Jawaban:

350

Untuk menghitung komit untuk cabang tempat Anda berada:

git rev-list --count HEAD

untuk cabang

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

Jika Anda ingin menghitung komit pada cabang yang dibuat sejak Anda membuat cabang

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

Ini akan menghitung semua komit yang pernah dibuat yang tidak atas nama cabang juga.

Contohnya

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

Hasil: 3

Jika cabang Anda berasal dari cabang yang disebut develop:

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

Hasil: 3

Mengabaikan Gabung

Jika Anda menggabungkan cabang lain ke cabang saat ini tanpa maju cepat dan Anda melakukan di atas, gabungan juga dihitung. Ini karena bagi git, gabungan adalah komit.

Jika Anda tidak ingin menghitung komit ini tambahkan --no-merges:

git rev-list --no-merges --count HEAD ^develop
Peter van der Do
sumber
7
tidak ada yang menunjukkan angka yang benar, misalnya master dan branchname menunjukkan jumlah komit yang sama.
botbot
Komentar tidak benar-benar memungkinkan kode, tetapi ini harus menunjukkan itu tidak berfungsi. ==== $ git init ==== $ touch test.txt ==== $ git tambahkan. ==== $ 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 Menambahkan . ==== $ 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
1
Saya setuju dengan @botbot. Ini tidak terlalu akurat. Misalnya, coba tambahkan beberapa gabungan komit atau tarik / rebase dan perhatikan penghitungan seperti yang digambarkan di atas mulai menjadi tidak dapat diandalkan.
Wil Moore III
2
@wilmoore Maksud Anda mendapat hitungan ekstra setelah Anda menggabungkan cabang? Secara teknis ini adalah komit, jadi dihitung. tetapi jika Anda tidak ingin menghitung komit ini tambahkan --no-gabungan. Saya akan memperbarui jawabannya.
Peter van der
2
rev-list --count flag tidak ada di git 1.7. Saat ini, saran yang diturunkan ke neraka di bawah git logini berfungsi lebih baik daripada saran lainnya.
aaronbauman
60

Untuk melihat total tidak ada komitmen, Anda dapat melakukan seperti yang disarankan Peter di atas

git rev-list --count HEAD

Dan jika Anda ingin melihat jumlah komitmen yang dibuat oleh setiap orang coba baris ini

git shortlog -s -n

akan menghasilkan output seperti ini

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi
Asnad Atta
sumber
3
apa angka-angka ini sebelum nama? dapatkah kamu menjelaskan
Ciasto piekarz
5
@Ciastopiekarz ini adalah jumlah komitmen dari setiap orang.
Asnad Atta
39

Mungkin memerlukan versi Git yang relatif baru, tetapi ini bekerja dengan baik untuk saya:

git rev-list --count develop..HEAD

Ini memberi saya hitungan tepat komit di cabang saat ini dengan basis master.

Perintah dalam jawaban Peter, git rev-list --count HEAD ^developtermasuk lebih banyak komitmen, 678 vs 97 pada proyek saya saat ini.

Riwayat komit saya linear pada cabang ini, demikian YMMV, tetapi memberi saya jawaban tepat yang saya inginkan, yaitu "Berapa banyak komit yang telah saya tambahkan sejauh ini pada cabang fitur ini?".

scanny
sumber
Harus sama. The docs mengatakan demikian . 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
Saya bingung: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;tidak mengantri. BEHIND seperti 1800 ketika pada kenyataannya tidak ada yang lebih besar dari menggabungkan upstream / master ~ 400 menghasilkan perubahan. menggunakan --no-mergestidak jauh lebih baik, memberi seperti 900. Dan jika saya melakukan penggabungan seperti ini dengan ~ 800, dan jumlah rev-list adalah 1800, maka saya melakukan penggabungan dengan ~ 790 saya mendapatkan antara 6 dan 28 jumlah yang lebih rendah di rev -daftar.
dlamblin
7

Berapa banyak komitmen yang dilakukan untuk cabang saat ini sejak awal sejarah, tidak termasuk komitmen dari cabang gabungan:

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

Dari dokumentasi git rev-list --help :

--first-parent

Ikuti hanya orang tua pertama yang berkomitmen setelah melihat gabungan komit. Opsi ini dapat memberikan tinjauan yang lebih baik saat melihat evolusi cabang topik tertentu, karena penggabungan ke cabang topik cenderung hanya tentang penyesuaian ke pembaruan hulu dari waktu ke waktu, dan opsi ini memungkinkan Anda untuk mengabaikan komitmen individu yang dibawa masuk ke sejarah Anda dengan penggabungan seperti itu. Tidak dapat digabungkan dengan --bisect.

Catatan: Klon dangkal akan mengecilkan ukuran riwayat. Misalnya jika Anda mengkloning --depth 1, akan mengembalikan 1.

jumlah komitmen yang dilakukan karena beberapa komitmen lain:

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

atau sama:

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

atau gunakan referensi git lainnya :

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

Hitungan komit dilakukan sejak 2018 tahun

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

01-01-2018, 01.01.2018, 2018.01.01 juga berfungsi.


git rev-label

Saya menulis sebuah skrip untuk mendapatkan revisi versi dari Git dalam format seperti '$refname-c$count-g$short$_dirty'yang diperluas master-c137-gabd32ef.
Bantuan disertakan ke skrip itu sendiri.

Kyb
sumber
git rev-list abc0923f .. --count --first-parent memberikan hasil yang tepat untuk cabang saya tetapi perintah pertama adalah memberikan nilai besar
Jiss Raphel
5

Bagaimana tentang git log --pretty=oneline | wc -l

Itu harus menghitung semua komitmen dari perspektif cabang Anda saat ini.

Remear
sumber
Kolom mana yang Anda hitung? Apakah ini yang pertama?
Hengjie
3

Saya suka melakukannya git shortlog -s -n --all. Memberi Anda daftar gaya "leaderboard" nama dan jumlah komit.

anorganik
sumber
2

Salah satu cara untuk melakukannya adalah mendaftar log untuk cabang Anda dan menghitung garis.

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

Baiklah, jawaban yang dipilih tidak berfungsi jika Anda memotong cabang dari cabang yang tidak spesifik (yaitu, tidak masteratau develop).

Di sini saya menawarkan cara lain yang saya gunakan di pre-pushkait git saya .

# 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

Untuk analisis lebih lanjut, silakan kunjungi blog saya

Paul Lan
sumber
1

Sebagai referensi OP Jumlah komit pada cabang di git saya ingin menambahkan bahwa jawaban yang diberikan di sana juga bekerja dengan cabang lain, setidaknya sejak git versi 2.17.1 (dan tampaknya lebih andal daripada jawaban oleh Peter van der Do):

bekerja dengan benar:

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

Perintah terakhir memberikan nol komit seperti yang diharapkan karena saya baru saja membuat cabang. Perintah sebelumnya memberi saya jumlah sebenarnya dari komit di cabang pengembangan saya dikurangi komit gabungan

tidak bekerja dengan benar:

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

Dalam kedua kasus saya mendapatkan jumlah semua komitmen di cabang pengembangan dan master dari mana cabang (secara tidak langsung) turun.

ya ampun
sumber
1

Jika Anda menggunakan sistem UNIX, Anda bisa melakukannya

git log|grep "Author"|wc -l
sekitar
sumber
-2

Anda juga dapat melakukan git log | grep commit | wc -l

dan dapatkan hasilnya kembali

james
sumber
1
Ini tidak bisa diandalkan. Itu akan cocok komit yang memiliki "komit" dalam pesan komit dua kali, misalnya.
rdb
@rdb Tidak itu tidak akan. Ini hanya akan menghasilkan jumlah baris yang mengandung kata "commit", jadi satu baris tidak akan pernah dihitung dua kali.
iBug
@ iBug: Anda tidak mengerti intinya. Jika pesan komit berisi kata "komit", itu muncul pada baris terpisah dari baris "komit a1b2c ..." di git logoutput, sehingga komit akan dihitung dua kali dalam hasilnya. Lebih buruk lagi jika pesan komit mengandung kata "komit" dua kali pada dua baris terpisah.
rdb