Bagaimana saya bisa "menyalahgunakan" menyalahkan (atau fungsi yang lebih cocok, dan / atau dalam hubungannya dengan perintah shell) untuk memberi saya statistik tentang berapa banyak baris (kode) saat ini dalam repositori yang berasal dari masing-masing committer?
Contoh Output:
Committer 1: 8046 Lines
Committer 2: 4378 Lines
Jawaban:
Memperbarui
Saya memperbarui beberapa hal dalam perjalanan.
Untuk kenyamanan, Anda juga bisa memasukkan ini ke dalam perintahnya sendiri:
simpan ini di suatu tempat di jalur Anda atau ubah jalur Anda dan gunakan seperti itu
git authors '*/*.c' # look for all files recursively ending in .c
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
git authors 'Makefile' # just count lines of authors in the Makefile
Jawaban Asli
Sementara jawaban yang diterima melakukan pekerjaan itu sangat lambat.
hampir seketika.
Untuk mendapatkan daftar file yang saat ini dilacak dapat Anda gunakan
Solusi ini menghindari panggilan
file
untuk menentukan tipe file dan menggunakan grep untuk mencocokkan ekstensi yang diinginkan untuk alasan kinerja. Jika semua file harus disertakan, cukup hapus ini dari baris.jika file dapat berisi spasi, yang buruk untuk shell, Anda dapat menggunakan:
Berikan daftar file (melalui pipa) yang dapat digunakan xargs untuk memanggil perintah dan mendistribusikan argumen. Perintah yang memungkinkan banyak file diproses diproses oleh
-n1
. Dalam hal ini kami memanggilgit blame --line-porcelain
dan untuk setiap panggilan kami menggunakan tepat 1 argumen.Kami kemudian memfilter output untuk kejadian "penulis" mengurutkan daftar dan menghitung garis duplikat dengan:
Catatan
Jawaban lain sebenarnya menyaring garis yang hanya berisi spasi putih.
Perintah di atas akan mencetak penulis baris yang mengandung setidaknya satu karakter non-spasi putih. Anda juga dapat menggunakan kecocokan
\w*[^\w#]
yang juga akan mengecualikan baris di mana karakter non-spasi pertama bukan merupakan#
(komentar dalam banyak bahasa scripting).sumber
echo "a\nb\nc"|xargs -n1 cmd
akan diperluas kecmd a; cmd b; cmd d
git ls-tree --name-only -r HEAD | grep -E '\.(cc|h|m|hpp|c)$' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr
Saya menulis permata bernama git-fame yang mungkin berguna.
Instalasi dan penggunaan:
$ gem install git_fame
$ cd /path/to/gitdir
$ git fame
Keluaran:
sumber
Penjelasan langkah demi langkah:
Daftar semua file di bawah kontrol versi
Pangkas daftar hanya ke file teks
Git menyalahkan semua file teks, mengabaikan perubahan spasi putih
Tarik keluar nama penulis
Urutkan daftar penulis, dan minta uniq menghitung jumlah baris berulang secara berurutan
Contoh output:
sumber
sed
versi yang berbeda , milik saya tidak mengerti-r
bendera dan memiliki masalah dengan regex (mengeluh tentang parens tidak seimbang, bahkan ketika saya menghapus kelebihannya(
).sudo brew install gnu-sed
dipecahkan itu. Bekerja seperti pesona!port install gsed
untuk pengguna MacPorts.sudo brew install gnu-sed
(yang berhasil) tetapi saya masih mendapatkan kesalahan yang tidak dikenali -r. :(git ls-tree -r HEAD|gsed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|gsed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|gsed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c
git summary
disediakan oleh paket git-ekstra adalah persis apa yang Anda butuhkan. Lihat dokumentasi di git-extras - ringkasan git :Memberikan output yang terlihat seperti ini:
sumber
Solusi Erik luar biasa, tapi saya punya beberapa masalah dengan diakritik (meskipun
LC_*
variabel lingkungan saya diatur dengan benar) dan kebisingan bocor pada baris kode yang benar-benar memiliki tanggal di dalamnya. Sed-fu saya buruk, jadi saya berakhir dengan potongan frankenstein ini dengan ruby di dalamnya, tetapi berhasil bagi saya tanpa cacat pada 200.000+ LOC, dan hasilnya seperti:Juga perhatikan
gsed
bukansed
karena itu menginstal biner homebrew, meninggalkan sistem sed utuh.sumber
git shortlog -sn
Ini akan menampilkan daftar commit per penulis.
sumber
Berikut ini cuplikan utama dari jawaban @Alex yang sebenarnya melakukan operasi agregasi garis menyalahkan. Saya telah memotongnya untuk beroperasi pada satu file daripada satu set file.
Saya memposting ini di sini karena saya sering kembali ke jawaban ini dan membaca kembali postingan dan mencerna ulang contoh-contoh untuk mengekstraksi bagian yang saya hargai sangat membebani. Juga tidak cukup umum untuk kasus penggunaan saya; ruang lingkupnya adalah untuk keseluruhan proyek C.
Saya suka daftar statistik per file, dicapai melalui dengan bash
for
iterator bukanxargs
karena saya menemukan xargs kurang mudah dibaca dan sulit digunakan / menghafal, Keuntungan / kerugian xargs vs untuk harus dibahas di tempat lain.Berikut ini cuplikan praktis yang akan menampilkan hasil untuk setiap file secara individual:
Dan saya menguji, menjalankan stright ini dalam bash shell adalah ctrl + c aman, jika Anda harus meletakkan ini di dalam skrip bash Anda mungkin perlu Trap pada SIGINT dan SIGTERM jika Anda ingin pengguna dapat memecahkan loop Anda.
sumber
git blame -w -M -C -C --line-porcelain path/to/file.txt | grep -I '^author ' | sort | uniq -ic | sort -nr
Menemukan sedikit tweak digit blame
sini yang lebih akurat menggambarkan statistik yang saya cari. Secara khusus, opsi -M dan -C -C (itu adalah dua C pada tujuan). -M mendeteksi gerakan dalam file, dan -C -C mendeteksi garis yang disalin dari file lain. Lihat dokumen di sini . Demi kelengkapan, -w mengabaikan spasi.Check out gitstats perintah yang tersedia dari http://gitstats.sourceforge.net/
sumber
Saya memiliki solusi ini yang menghitung garis menyalahkan di semua file teks (tidak termasuk file biner, bahkan yang versi):
sumber
Ini berfungsi di direktori mana pun dari struktur sumber repo, jika Anda ingin memeriksa modul sumber tertentu.
sumber
Saya mengadopsi jawaban teratas untuk Powershell:
Ini opsional jika Anda menjalankan
git blame
dengan-w
switch, saya menambahkannya karena mengabaikan perubahan spasi putih.Kinerja pada mesin saya mendukung Powershell (~ 50s vs ~ 65s untuk repo yang sama), meskipun solusi Bash berjalan di bawah WSL2
sumber
Membuat skrip saya sendiri yang merupakan kombinasi dari @nilbus dan @Alex
sumber
enter code here
menyebabkan masalah .... apakah ini berfungsi dengan benar?Fungsi Bash yang menargetkan file sumber tunggal berjalan di MacOS.
sumber