Apakah ada perintah yang bisa saya panggil yang akan menghitung baris yang diubah oleh penulis tertentu dalam repositori Git? Saya tahu bahwa harus ada cara untuk menghitung jumlah komit karena Github melakukan ini untuk grafik Dampak mereka.
458
git://git.lwn.net/gitdm.git
.Jawaban:
Output dari perintah berikut seharusnya cukup mudah untuk dikirim ke skrip untuk menjumlahkan totalnya:
Ini memberikan statistik untuk semua komitmen pada KEPALA saat ini. Jika Anda ingin menambahkan statistik di cabang lain, Anda harus menyediakannya sebagai argumen
git log
.Untuk meneruskan ke skrip, menghapus bahkan format "oneline" dapat dilakukan dengan format log kosong, dan seperti dikomentari oleh Jakub Narębski,
--numstat
adalah alternatif lain. Ini menghasilkan per-file daripada statistik per-baris tetapi bahkan lebih mudah untuk diuraikan.sumber
--numstat
alih-alih--shortstat
jika Anda ingin menambahkan statistik sedikit lebih mudah.git help log
memberi tahu saya bahwa baris pertama ditambahkan, baris kedua dihapus.Ini memberikan beberapa statistik tentang penulis, modifikasi sesuai kebutuhan.
Menggunakan Gawk:
Menggunakan Awk di Mac OSX:
EDIT (2017)
Ada paket baru di github yang terlihat apik dan menggunakan bash sebagai dependensinya (diuji di linux). Ini lebih cocok untuk penggunaan langsung daripada skrip.
Nya git-quick-stats (tautan github) .
Salin
git-quick-stats
ke folder dan tambahkan folder ke jalur.Pemakaian:
sumber
gawk
untukawk
untuk membuatnya bekerja di terminal OSXgit clone https://github.com/arzzen/git-quick-stats.git
Jika ada yang ingin melihat statistik untuk setiap pengguna dalam basis kode mereka, beberapa rekan kerja saya baru-baru ini membuat satu kalimat yang mengerikan ini:
(Butuh beberapa menit untuk membaca repo kami, yang memiliki komitmen sekitar 10-15rb.)
sumber
michael,: 6057 files changed, 854902 insertions(+), 26973 deletions(-), 827929 net
Ketenaran Git https://github.com/oleander/git-fame-rb
adalah alat yang bagus untuk mendapatkan penghitungan bagi semua penulis sekaligus, termasuk jumlah file yang dikomit dan dimodifikasi:
Ada juga versi Python di https://github.com/casperdcl/git-fame (disebutkan oleh @fracz):
Output sampel:
Tetapi berhati-hatilah: seperti yang disebutkan oleh Jared dalam komentar, melakukannya di repositori yang sangat besar akan memakan waktu berjam-jam. Tidak yakin apakah itu bisa diperbaiki, mengingat itu harus memproses data Git begitu banyak.
sumber
git fame --branch=dev --timeout=-1 --exclude=Pods/*
Saya menemukan yang berikut berguna untuk melihat siapa yang memiliki paling banyak baris yang saat ini dalam basis kode:
Jawaban lain sebagian besar terfokus pada garis yang diubah dalam komit, tetapi jika komit tidak bertahan dan ditimpa, mereka mungkin hanya churn. Mantra di atas juga membuat Anda semua komuter diurutkan berdasarkan garis, bukan hanya satu per satu. Anda dapat menambahkan beberapa opsi ke git menyalahkan (-C -M) untuk mendapatkan beberapa angka yang lebih baik yang mempertimbangkan perpindahan file dan perpindahan garis antar file ke dalam akun, tetapi perintah itu mungkin berjalan jauh lebih lama jika Anda melakukannya.
Selain itu, jika Anda mencari baris yang diubah di semua komit untuk semua committer, ikuti skrip kecil ini membantu:
http://git-wt-commit.rubyforge.org/#git-rank-contributors
sumber
/^.*\((.*?)\s[\d]{4}/
seharusnya/^.*?\((.*?)\s[\d]{4}/
untuk mencegah pencocokan tanda kurung di sumber sebagai penulis.Untuk menghitung jumlah komit oleh penulis yang diberikan (atau semua penulis) pada cabang tertentu Anda dapat menggunakan git-shortlog ; lihat terutama opsi
--numbered
dan--summary
, misalnya ketika dijalankan pada repositori git:sumber
v1.6.4
ada di sini dalam contoh ini untuk membuat output menjadi deterministik: akan tetap sama tidak peduli kapan Anda mengkloning dan / atau mengambil dari repositori git.v1.6.4
memberi saya:fatal: ambiguous argument 'v1.6.4': unknown revision or path not in the working tree.
git shortlog -sne
atau, jika Anda lebih suka tidak menyertakan penggabungangit shortlog -sne --no-merges
-s
adalah--summary
,-n
adalah--numbered
, dan [baru]-e
adalah--email
untuk menunjukkan email dari penulis (dan menghitung secara terpisah penulis yang sama dengan alamat email yang berbeda, dengan memperhitungkan.mailmap
koreksi). Panggilan bagus tentang--no-merges
.Setelah melihat Alex dan Gerty3000 jawaban , saya telah mencoba untuk memperpendek garis satu:
Pada dasarnya, menggunakan numstat git log dan tidak melacak jumlah file diubah.
Git versi 2.1.0 di Mac OSX:
Contoh:
sumber
The Jawaban dari AaronM menggunakan shell satu-kapal yang baik, tetapi sebenarnya, masih ada bug lain, di mana ruang akan merusak nama pengguna jika ada jumlah yang berbeda dari ruang putih antara nama pengguna dan tanggal. Nama pengguna yang rusak akan memberikan beberapa baris untuk jumlah pengguna dan Anda harus menjumlahkannya sendiri.
Perubahan kecil ini memperbaiki masalah bagi saya:
Perhatikan tanda + yang akan menghabiskan semua spasi putih dari nama hingga tanggal.
Sebenarnya menambahkan jawaban ini sebanyak untuk ingatan saya sendiri seperti untuk membantu orang lain, karena ini setidaknya kedua kalinya saya google subjek :)
--show-email
kegit blame -w
agregat pada email sebagai gantinya, karena beberapa orang menggunakanName
format berbeda pada komputer yang berbeda, dan kadang-kadang dua orang dengan nama yang sama bekerja di git yang sama.sumber
unsupported file type
tetapi selain itu tampaknya berfungsi dengan baik bahkan dengan mereka (itu dilewati)Berikut ini adalah kalimat singkat yang menghasilkan statistik untuk semua penulis. Ini jauh lebih cepat daripada solusi Dan di atas di https://stackoverflow.com/a/20414465/1102119 (tambang memiliki kompleksitas waktu O (N) daripada O (NM) di mana N adalah jumlah komit, dan M jumlah penulis ).
sumber
--no-show-signature
, jika tidak, orang yang menandatangani-pgt tidak akan dihitung.count-lines = "!f() { git log --no-merges --pretty=format:%an --numstat | awk '/./ && !author { author = $0; next } author { ins[author] += $1; del[author] += $2 } /^$/ { author = \"\"; next } END { for (a in ins) { printf \"%10d %10d %10d %s\\n\", ins[a] - del[a], ins[a], del[a], a } }' | sort -rn; }; f"
. (Catatan saya di Windows; Anda mungkin perlu menggunakan berbagai jenis kutipan)@mmrobins @AaronM @ErikZ @JamesMishra menyediakan varian yang semuanya memiliki masalah yang sama: mereka meminta git untuk membuat campuran informasi yang tidak dimaksudkan untuk konsumsi skrip, termasuk konten baris dari repositori pada baris yang sama, kemudian mencocokkan kekacauan dengan regexp .
Ini adalah masalah ketika beberapa baris tidak valid teks UTF-8, dan juga ketika beberapa baris cocok dengan regexp (ini terjadi di sini).
Inilah baris yang dimodifikasi yang tidak memiliki masalah ini. Ia meminta git untuk menampilkan data secara bersih pada baris yang berbeda, yang membuatnya mudah untuk menyaring apa yang kita inginkan dengan kuat:
Anda dapat menangkap string lain, seperti author-mail, committer, dll.
Mungkin pertama-tama lakukan
export LC_ALL=C
(dengan asumsibash
) untuk memaksa pemrosesan byte-level (ini juga terjadi untuk mempercepat grep dari lokasi berbasis UTF-8).sumber
Sebuah solusi diberikan dengan ruby di tengah, perl menjadi sedikit lebih tersedia secara default di sini adalah alternatif menggunakan perl untuk baris saat ini oleh penulis.
sumber
Selain jawaban Charles Bailey , Anda mungkin ingin menambahkan
-C
parameter ke perintah. Kalau tidak, nama file dihitung sebagai banyak tambahan dan penghapusan (sebanyak file memiliki garis), bahkan jika konten file tidak diubah.Sebagai ilustrasi, berikut adalah komit dengan banyak file yang dipindahkan dari salah satu proyek saya, ketika menggunakan
git log --oneline --shortstat
perintah:Dan di sini, komit yang sama menggunakan
git log --oneline --shortstat -C
perintah yang mendeteksi salinan dan mengganti nama file:Menurut pendapat saya yang terakhir memberikan pandangan yang lebih realistis tentang seberapa besar dampak seseorang terhadap proyek, karena mengubah nama file adalah operasi yang jauh lebih kecil daripada menulis file dari awal.
sumber
Anda dapat menggunakan whodid ( https://www.npmjs.com/package/whodid )
dan
atau ketik saja
maka Anda dapat melihat hasilnya seperti ini
sumber
-g
harus datang sebelum nama paket, padamacOS
. Cukup berusaha membantu.Berikut ini adalah skrip ruby cepat yang mengkoreksi dampak per pengguna terhadap kueri log yang diberikan.
Misalnya, untuk rubinius :
naskah:
sumber
ini adalah cara terbaik dan juga memberi Anda gambaran yang jelas tentang jumlah total komitmen oleh semua pengguna
sumber
Saya memberikan modifikasi dari jawaban singkat di atas, tetapi itu tidak cukup untuk kebutuhan saya. Saya harus bisa mengkategorikan baris yang berkomitmen dan baris dalam kode akhir. Saya juga ingin rincian berdasarkan file. Kode ini tidak berulang, itu hanya akan mengembalikan hasil untuk direktori tunggal, tetapi ini adalah awal yang baik jika seseorang ingin melangkah lebih jauh. Salin dan tempel ke file dan buat bisa dieksekusi atau jalankan dengan Perl.
sumber
Untuk pengguna windows Anda dapat menggunakan skrip batch berikut yang menghitung baris yang ditambahkan / dihapus untuk penulis yang ditentukan
https://gist.github.com/zVolodymyr/62e78a744d99d414d56646a5e8a1ff4f
sumber
Ini adalah repo yang bagus yang membuat hidup Anda lebih mudah
git-quick-stats
Pada mac dengan minuman yang diinstal
brew install git-quick-stats
Lari
git-quick-stats
Cukup pilih opsi mana yang Anda inginkan dari daftar ini dengan mengetikkan nomor yang tercantum dan menekan enter.
sumber
Skrip ini di sini akan melakukannya. Masukkan ke dalam authorhip.sh, chmod + x, dan Anda siap.
sumber
Simpan log Anda ke dalam file menggunakan:
Untuk pecinta Python:
Output Anda akan seperti:
sumber
Anda ingin Git disalahkan .
Ada opsi --show-stats untuk mencetak beberapa, well, stats.
sumber
blame
, tetapi itu tidak benar-benar memberikan statistik yang saya pikir OP butuhkan?Pertanyaannya menanyakan informasi spesifik penulis , tetapi banyak dari jawabannya adalah solusi yang mengembalikan daftar peringkat penulis berdasarkan baris kode mereka yang diubah.
Inilah yang saya cari, tetapi solusi yang ada tidak cukup sempurna. Untuk kepentingan orang-orang yang mungkin menemukan pertanyaan ini melalui Google, saya telah membuat beberapa perbaikan pada mereka dan menjadikannya menjadi skrip shell, yang saya tampilkan di bawah ini. Yang beranotasi (yang akan terus saya pertahankan) dapat ditemukan di Github saya .
Tidak ada dependensi pada Perl atau Ruby. Selanjutnya, spasi putih, penggantian nama, dan pergerakan garis diperhitungkan dalam jumlah perubahan baris. Masukkan saja ini ke dalam file dan berikan repositori Git Anda sebagai parameter pertama.
sumber
Alat terbaik sejauh ini yang saya identifikasi adalah gitinspector. Ini memberikan laporan yang ditetapkan per pengguna, per minggu dll Anda dapat menginstal seperti di bawah ini dengan npm
npm instal -g gitinspector
Tautan untuk mendapatkan detail lebih lanjut
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
contoh perintahnya adalah
sumber
Saya menulis skrip Perl ini untuk menyelesaikan tugas itu.
Saya menamainya
git-line-changes-by-author
dan dimasukkan ke dalam/usr/local/bin
. Karena disimpan di jalur saya, saya bisa mengeluarkan perintahgit line-changes-by-author --before 2018-12-31 --after 2020-01-01
untuk mendapatkan laporan untuk tahun 2019. Sebagai contoh. Dan jika saya salah mengeja nama git akan menyarankan ejaan yang tepat.Anda mungkin ingin menyesuaikan
_get_repo_slug
sub untuk hanya menyertakan bagian terakhir dariremote.origin.url
repo saya yang disimpanproject/repo
dan mungkin tidak.sumber