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 ...


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.


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.


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.


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.


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.


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 .


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 

22

Cara sederhana adalah:

 git log --oneline | wc -l

oneline memastikan itu.


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`

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.


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



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]

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.


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)

1

Yang saya gunakan adalah:

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

Sederhana tapi berhasil.


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.


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

1

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

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

git count


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"


0

Bagaimana kalau membuat alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.