Bagaimana cara saya mendapatkan hitungan Git commit?

753

Saya ingin mendapatkan jumlah komit dari repositori Git saya, sedikit seperti nomor revisi SVN.

Tujuannya adalah untuk menggunakannya sebagai nomor build yang unik dan bertambah.

Saat ini saya melakukan hal itu, di Unix / Cygwin / msysGit:

git log --pretty=format:'' | wc -l

Tapi saya merasa ini sedikit hack.

Apakah ada cara yang lebih baik untuk melakukan itu? Akan keren jika saya benar-benar tidak membutuhkan wcatau bahkan Git, sehingga bisa bekerja pada Windows yang telanjang. Cukup baca file atau struktur direktori ...

Splo
sumber
1
Anda dapat menemukan jawaban yang menarik di sini: apa yang setara dengan git untuk nomor revisi?
Sebastien Varrette
190
git rev-list HEAD --count git rev-list
Jake Berger
14
@ jberger: Saya pikir komentar Anda harus dikonversi menjadi jawaban.
utapyngo
@utapyngo: diberi 13 jawaban lain, saya tahu itu akan dikubur. Saya sudah mempostingnya di sini .
Jake Berger
@ jberger, jawaban ini tidak berfungsi untuk git1.7.0.
Vorac

Jawaban:

1160

Untuk mendapatkan jumlah komit untuk revisi ( HEAD,, masterhash komit):

git rev-list --count <revision>

Untuk mendapatkan jumlah komit di semua cabang:

git rev-list --all --count

Saya sarankan agar tidak menggunakan ini untuk pengidentifikasi bangunan, tetapi jika Anda harus, mungkin yang terbaik adalah menggunakan hitungan untuk cabang yang Anda lawan. Dengan begitu revisi yang sama akan selalu memiliki nomor yang sama. Jika Anda menggunakan hitungan untuk semua cabang, aktivitas di cabang lain dapat mengubah jumlahnya.

Benjamin Atkin
sumber
27
git shortlog | grep -E '^[ ]+\w+' | wc -ljika Anda ingin mendapatkan jumlah total dan git shortlog | grep -E '^[^ ]'jika Anda ingin mendapatkan nomor komit untuk setiap kontributor.
skalee
2
Terima kasih telah menunjukkan wc -l. FTW minimalis. Saya memasukkannya ke dalam jawaban saya.
Benjamin Atkin
17
Solusi ini adalah peretasan (mirip dengan git log --pretty=format:'' | wc -lpendekatan yang diberikan dalam pertanyaan awal) dan salah: Anda dapat melihat ini dengan membalikkan kecocokan ( git shortlog | grep -Ev '^[ ]+\w+') dan melihat bahwa mis. Melakukan tanpa pesan (yaitu, "<none>") tidak dihitung. Menggunakan git rev-list HEAD --countkeduanya lebih ringkas dan lebih akurat.
ctrueden
17
@BenAtkin: Permintaan maaf saya; bukan maksud saya untuk menyerang, hanya faktual. Poin yang diambil tentang tanggal tanggapan. Pada saat itu, solusi Anda mungkin yang terbaik yang tersedia. Tetapi saya mendukung pernyataan saya bahwa itu git rev-list HEAD --countadalah solusi yang lebih baik sekarang.
ctrueden
3
Menambahkan jawaban juga dan bekerja juga dengan versi lama:git log --oneline | wc -l
Jimmy Kane
155

git shortlog adalah satu arah.

Rayne
sumber
5
Ty. Ini bekerja untuk saya ketika menghitung komit dalam kisaran; git shortlog sha1..sha2
RJFalconer
1
Yap, baris pertama dari git shortlog memiliki jumlah commit di dalamnya. Masalah terpecahkan.
Robert Massaioli
5
Jumlah komit dikelompokkan berdasarkan komuter, tidak begitu baik. Dapat menghitung baris dalam git shortlog, tetapi ini tidak berhasil pada ssh tanpa terminal karena suatu alasan (pager?). Solusi asli si penanya adalah yang terbaik! git log --pretty = format: '' | wc -l
Sam Watkins
4
Namun, saya akan menyarankan git rev-list HEAD --countdaripada pendekatan asli yang diberikan dalam OP. Dalam tes saya, git log --pretty=format:'' | wc -ldimatikan satu per satu.
ctrueden
3
@ctrueden git log --oneline | wc -ltidak dimatikan oleh satu (OS X 10.8.5).
Andy Stewart
111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: Daftar komit yang dapat dijangkau dengan mengikuti tautan induk dari komit yang diberikan (dalam hal ini, KEPALA ).

--count : Cetak angka yang menyatakan berapa banyak komit yang akan terdaftar, dan tekan semua output lainnya.

Jake Berger
sumber
101

Perintah ini mengembalikan jumlah komit yang dikelompokkan berdasarkan komiter:

git shortlog -s

Keluaran:

14 John lennon
9  Janis Joplin

Anda mungkin ingin tahu bahwa -sargumennya adalah bentuk kontraksi dari --summary.

Alex Pliutau
sumber
11
git shortlogdengan sendirinya tidak menjawab pertanyaan awal dari jumlah total komitmen (tidak dikelompokkan berdasarkan penulis). Gunakan git rev-list HEAD --countsebagai gantinya.
ctrueden
5
Luar biasa! Anda dapat mengurutkannya | sort -njuga
Mohsen
54

Jika Anda sedang mencari pengidentifikasi yang unik dan masih cukup mudah dibaca, git menjelaskan mungkin hanya cocok untuk Anda.

Bombe
sumber
2
Itu bisa bekerja dan akan lebih mudah digunakan daripada algo yang dibuat khusus. +1
VonC
2
Saya tidak tahu git menjelaskan. Nomor kecil antara nama tag dan sha1 ini adalah apa yang saya cari. Terima kasih.
Splo
2
Lihatlah skrip GIT-VERSION-GEN dan bagaimana skrip ini digunakan dalam repositori git, dan skrip serupa di sumber kernel Linux (dan bagaimana skrip tersebut digunakan dalam Makefile).
Jakub Narębski
Ini memberikan id yang unik, tetapi tidak INCREMENTAL. Tidak bekerja untuk saya. Namun jawaban Ben Atkin menawarkan jumlah komit, yang dalam praktiknya harus inkremental. Jawaban Aaron Digulla lebih pasti, tetapi juga membutuhkan lebih banyak pekerjaan.
JOM
2
Ya, itu karena konsep dari inkremental ID tidak masuk akal dengan sistem kontrol versi terdistribusi.
Bombe
34

Anda bukan yang pertama berpikir tentang "angka revisi" di Git , tetapi ' wccukup berbahaya, karena komit dapat dihapus atau dihancurkan, dan sejarah ditinjau kembali.

"Angka revisi" sangat penting untuk Subversion karena diperlukan dalam kasus penggabungan (SVN1.5 dan 1.6 telah meningkat di bagian depan itu).

Anda bisa berakhir dengan kait pra-komit yang akan menyertakan nomor revisi dalam komentar, dengan algoritma yang tidak melibatkan mencari semua riwayat cabang untuk menentukan nomor yang benar.

Bazaar sebenarnya datang dengan algoritma seperti itu , dan itu mungkin merupakan titik awal yang baik untuk apa yang ingin Anda lakukan.

(Seperti yang ditunjukkan oleh jawaban Bombe , Git sebenarnya memiliki algoritma sendiri, berdasarkan pada tag terbaru, ditambah jumlah komit, ditambah sedikit kunci SHA-1). Anda harus melihat (dan mendukung) jawabannya jika itu berhasil untuk Anda.


Untuk mengilustrasikan ide Aaron , Anda juga dapat menambahkan hasit komit Git ke dalam file "info" aplikasi yang Anda distribusikan dengan aplikasi Anda.

Dengan begitu, kotak about akan terlihat seperti:

Tentang kotak

Nomor aplikasi adalah bagian dari komit, tetapi file "info" aplikasi dihasilkan selama proses pengemasan, yang secara efektif menghubungkan nomor pembuatan aplikasi dengan id revisi teknis .

VONC
sumber
2
Saya telah memperbarui skrip saya agar berfungsi dengan Xcode 3. Anda dapat mengambil versi terbaru dari gist.github.com/208825 .
Abizern
34

Anda bisa menggunakan:

git shortlog -s -n

Hasil:

 827  user one
    15  user two
     2  Gest 
demenvil
sumber
22

Cara sederhana adalah:

 git log --oneline | wc -l

oneline memastikan itu.

Jimmy Kane
sumber
1
'wc' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dijalankan atau file batch.
user815693
Nah sistem apa yang Anda gunakan? Apakah itu yang UNIX? /
Jimmy Kane
1
Ini tampaknya lebih cepat juga jika Anda memiliki ribuan komitmen. Semua perintah lain terlalu banyak waktu.
Danny Coulombe
21

Untuk memasukkannya ke dalam variabel, cara termudah adalah:

export GIT_REV_COUNT=`git rev-list --all --count`
John Gietzen
sumber
5
Memang, git rev-listadalah alat yang tepat untuk digunakan, tidak git logseperti yang dikatakan orang lain.
Nayuki
1
Untuk menghitung jumlah komit dalam garis keturunan untuk mencapai HEAD: git rev-list --first-parent | wc -l
200_success
Anda tidak perlu wc -lhanya menggunakan --countswitch: git rev-list --all --count.
slm
Terima kasih @slm, saya telah memperbarui jawabannya. Meskipun, saya menduga jawaban aslinya lebih tua dari --countsaklar itu sendiri.
John Gietzen
@ JohnGietzen - oh ya saya pikir 8-), baru saja menambahkan detail ini untuk membantu.
slm
17

Git shortlog adalah salah satu cara untuk mendapatkan detail komit:

git shortlog -s -n

Ini akan memberikan jumlah komit diikuti oleh nama penulis. Opsi -s menghapus semua pesan komit untuk setiap komit yang dibuat penulis. Hapus opsi yang sama jika Anda juga ingin melihat pesan komit. Opsi -n digunakan untuk mengurutkan seluruh daftar. Semoga ini membantu.

Sri Murthy Upadhyayula
sumber
2
git shortlogdengan sendirinya tidak menjawab pertanyaan awal dari jumlah total komitmen (tidak dikelompokkan berdasarkan penulis). Gunakan git rev-list HEAD --countsebagai gantinya.
ctrueden
8

git rev-parse --Kepala pendek

makuchaku
sumber
1
Menghasilkan hash, sedangkan nomor diminta.
Jesse Glick
4

Jika Anda hanya menggunakan satu cabang, seperti master, saya pikir ini akan berhasil:

git rev-list --full-history --all | wc -l

Ini hanya akan menghasilkan angka. Anda dapat alias ke sesuatu seperti

git revno

untuk membuat semuanya benar-benar nyaman. Untuk melakukannya, edit .git/configfile Anda dan tambahkan ini di:

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

Ini tidak akan berfungsi pada Windows. Saya tidak tahu sama dengan "wc" untuk OS itu, tetapi menulis skrip Python untuk melakukan penghitungan untuk Anda akan menjadi solusi multi-platform.

EDIT : Dapatkan hitung di antara dua komit:


Saya mencari jawaban yang akan menunjukkan cara mendapatkan jumlah komit antara dua revisi sewenang-wenang dan tidak melihat apa pun.

git rev-list --count [older-commit]..[newer-commit]
NuclearPeon
sumber
3

Buat nomor selama pembuatan dan tulis ke file. Setiap kali Anda membuat rilis, komit file itu dengan komentar "Build 147" (atau apa pun nomor build saat ini). Jangan komit file selama perkembangan normal. Dengan cara ini, Anda dapat dengan mudah memetakan antara angka dan versi build di Git.

Aaron Digulla
sumber
Jika dua pengembang terdistribusi melakukan ini, bukankah jumlah build mereka akan bertabrakan / berpotongan secara berkala? Bagaimana jika mereka berdua melakukan pembangunan antara revs yang sama dari repo bersama, atau mungkin tabrakan hanya akan terjadi jika salah satu dari mereka memiliki perubahan tidak berkomitmen untuk repo bersama. Tidak yakin.
Hobs
Tentu, tetapi konflik memberi tahu Anda apa yang harus dilakukan: Cukup bicara dengan pria lain atau selalu gunakan nomor yang lebih tinggi. Ingat: Angka tidak dapat secara ajaib menyembuhkan proses pembangunan yang rusak. Itu hanya pengingat atau petunjuk bahwa Anda perlu memeriksa sesuatu.
Aaron Digulla
1
Ahh, ya, file magic buildno.txt dilakukan bersamaan dengan yang lainnya. Pendekatan yang baik untuk tim kecil, atau tim besar yang menghindari pembangunan paralel. Satu-satunya tempat yang saya bisa pikirkan bahwa itu mungkin tidak berfungsi dengan baik adalah untuk tim besar menggunakan bahasa skrip (python) yang tidak memerlukan proses pembangunan (untuk menetapkan satu orang untuk melakukan pembangunan).
Hobs
3

Di perusahaan kami, kami pindah dari SVN ke Git. Kurangnya angka revisi adalah masalah besar!

Lakukan git svn clone, lalu beri tag SVN terakhir yang dilakukan oleh nomor revisi SVN-nya:

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

Maka Anda bisa mendapatkan nomor revisi dengan bantuan

git describe --tags --long

Perintah ini memberikan sesuatu seperti:

7603-3-g7f4610d

Berarti: Tag terakhir adalah 7603 - ini adalah revisi SVN. 3 - adalah jumlah komitmen dari itu. Kita perlu menambahkannya.

Jadi, nomor revisi dapat dihitung dengan skrip ini:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)
Matvey
sumber
1

Yang saya gunakan adalah:

git log | grep "^commit" | wc -l

Sederhana tapi berhasil.

Robert Massaioli
sumber
4
dibutuhkan satu baris pesan komit yang dimulai dengan "komit" untuk memutuskan. Sebagai contoh: "kesalahan yang diperbaiki dan tes yang rusak yang saya sengaja mendorong terakhir \ ncommit"
Paweł Polewicz
1

Menggunakan sintaks Bash,

$(git rev-list --count HEAD)

kelihatannya bagus untuk sejarah linier murni. Jika Anda juga ingin terkadang memiliki "angka" dari cabang (berdasarkan master), pertimbangkan:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

Saat dijalankan dari checkout master, Anda mendapatkan secara sederhana 1234.0atau sejenisnya. Ketika dijalankan dari checkout cabang Anda akan mendapatkan sesuatu seperti 1234.13, jika ada 13 komitmen yang dibuat pada cabang itu. Jelas ini hanya berguna sejauh Anda mendasarkan paling banyak satu cabang dari masterrevisi yang diberikan .

--first-parent dapat ditambahkan ke nomor mikro untuk menekan beberapa komitmen yang timbul hanya dari penggabungan cabang lain, meskipun mungkin tidak perlu.

Jesse Glick
sumber
1

Anda dapat mencoba

git log --oneline | wc -l

atau untuk membuat daftar semua komitmen yang dilakukan oleh orang-orang yang berkontribusi dalam repositori

git shortlog -s

sumber
1

git config --global alias.count 'rev-list --all --count'

Jika Anda menambahkan ini ke konfigurasi Anda, Anda bisa mereferensikan perintah;

git count

Robert Pounder
sumber
0

Gunakan git shortlog seperti ini

git shortlog -sn

Atau buat alias (untuk terminal berbasis ZSH)

# show contributors by commits alias gcall="git shortlog -sn"

Ahmad Awais
sumber
0

Bagaimana kalau membuat alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
karat
sumber