Menemukan file yang paling banyak diubah di Git

105

Bagaimana cara menampilkan file di Git yang paling sering berubah?

Sebastian
sumber

Jawaban:

45

Anda dapat menggunakan perintah git effort(dari git-extraspaket) yang menunjukkan statistik tentang berapa banyak komit per file (berdasarkan komit dan hari aktif).

EDIT: git effort hanyalah skrip bash yang dapat Anda temukan di sini dan menyesuaikan dengan kebutuhan Anda jika Anda membutuhkan sesuatu yang lebih istimewa.

Asenar
sumber
Outputnya akan menjadi 2 bagian, pertama Anda mendapatkan hasil yang tidak diurutkan, lalu hasil yang diurutkan (dan diwarnai). Baik?
Andy
@Andy tampaknya (dan git help efforttidak memiliki informasi tentang itu: /). Saya berasumsi rangkaian hasil pertama diurutkan berdasarkan nama file, dan yang kedua berdasarkan jumlah komit per file. Halaman manual juga menyebutkan github.com/tj/git-extras/issues untuk melaporkan masalah
Asenar
apakah ini mirip dengan ini? blog.riff.org/…
155

Anda dapat melakukan sesuatu seperti berikut:

git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10

Log hanya menampilkan nama-nama file yang telah diubah di setiap komit, sementara sisanya hanya mengurutkan dan menampilkan 10 nama file yang paling sering muncul.

Mark Longair
sumber
Bisakah Anda memberi tahu saya jika ini didasarkan pada cabang saat ini atau jika ini untuk seluruh repositori? Bagaimana dengan cabang yang belum digabung?
Karthick S
@KarthickS: itu hanya untuk komit di cabang saat ini - Anda dapat menambahkan --brancheske git logjika Anda ingin menyertakan komit di salah satu cabang lokal Anda.
Mark Longair
1
Bagus. Juga, saya menemukan itu juga file laporan yang telah lama dihapus. Perbaikan cepat adalah membatasi waktu, misalnya: --since = "tahun lalu"
FractalSpace
2
juga membantu adalah menggunakan --since "1 month ago"atau opsi lain untuk mempersempit jendela waktu
3
Menemukan bagian dari jawaban saya:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331
13

Saya melihat bahwa jawaban Mark dan sehe tidak ada --followdalam file, artinya mereka berhenti begitu mencapai nama file diganti. Skrip ini akan jauh lebih lambat, tetapi akan berfungsi untuk tujuan itu.

git ls-files |
while read aa
do
  printf . >&2
  set $(git log --follow --oneline "$aa" | wc)
  printf '%s\t%s\n' $1 "$aa"
done > bb
echo
sort -nr bb
rm bb

git-most.sh

Steven Penny
sumber
1
Untuk memperluas ini saya membuat gist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350 Ini menggabungkan perubahan berdasarkan folder, khususnya oleh setiap folder di rolesdirektori untuk kasus saya tetapi mudah dimodifikasi agar sesuai dengan kasus penggunaan Anda.
Almenon
3

Untuk PowerShell, dengan asumsi Anda memasang git bash

git log --pretty=format: --name-only | sort | uniq -c | sort -Descending | select -First 10
hyeomans
sumber
3

Ini adalah versi windows

git log --pretty=format: --name-only  > allfiles.csv

lalu buka di excel

A1: FileName
A2: isVisibleFilename  >> =IFERROR(IF(C2>0,TRUE,FALSE),FALSE)
A3: DotLocation >> =FIND("@",SUBSTITUTE(A2,".","@",(LEN(A2)-LEN(SUBSTITUTE(A2,".","")))/LEN(".")))
A4: HasExt       >> =C2>1
A5: TYPE        >> =IF(D2=TRUE,MID(A2,C2+1,18),"")

buat tabel pivot

values: Type
  Filter: isFilename = true
  Rows : Type
  Sub : FileName

click [Count Of TYPE] -> Sort -> Sort Largest To Smallest
Mickey Perlstein
sumber
Karena saya tidak tahu banyak tentang excel, saya tidak mengerti instruksi ini.
BigMiner
2
git whatchanged --all | \grep "\.\.\." | cut -d' ' -f5- | cut -f2- | sort | uniq -c | sort

Jika Anda hanya ingin melihat file Anda tambahkan --authorke git whatchanged --author=name --all.

Andy
sumber
1

Pertanyaan lama, tapi menurut saya masih pertanyaan yang sangat berguna. Berikut adalah contoh kerja di PowerShell lurus. Ini akan mendapatkan 10 file paling banyak berubah di repo Anda sehubungan dengan cabang tempat Anda berada.

git log --pretty=format: --name-only | Where-Object { ![string]::IsNullOrEmpty($_) } | Sort-Object | Group-Object  | Sort-Object -Property Count -Descending | Select-Object -Property Count, Name -First 10
Omar Rodriguez
sumber
0

Kami juga dapat menemukan file yang diubah antara dua komit atau cabang, misalnya

git log  --pretty=format: --name-only <source_branch>...<target_branch> | sort | uniq -c | sort -rg | head -50 
Pawan Maheshwari
sumber
0

Ini mungkin jelas, tetapi, kueri yang diberikan akan menampilkan semua file, tetapi, mungkin Anda tidak tertarik untuk mengetahui bahwa konfigurasi atau file proyek Anda adalah yang terbaru. Grep sederhana akan mengisolasi file kode Anda, misalnya:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
Reginald Blue
sumber