ค้นหาไฟล์ที่เปลี่ยนแปลงส่วนใหญ่ใน Git


คำตอบ:


46

คุณสามารถใช้คำสั่งgit effort(จากgit-extrasแพ็กเกจ) ซึ่งแสดงสถิติเกี่ยวกับจำนวนคอมมิตต่อไฟล์ (ตามคอมมิตและวันที่ใช้งาน)

แก้ไข: ความพยายามในการคอมไพล์เป็นเพียงสคริปต์ทุบตีที่คุณสามารถพบได้ที่นี่และปรับให้เข้ากับความต้องการของคุณหากคุณต้องการสิ่งที่พิเศษกว่านั้น


ผลลัพธ์จะเป็นแบบ 2 ส่วนก่อนอื่นคุณจะได้ผลลัพธ์ที่ไม่เรียงลำดับจากนั้นผลลัพธ์ที่เรียงลำดับ (และสี) ขวา?
Andy

@ ดูเหมือนว่าจะ (และgit help effortไม่มีข้อมูลเกี่ยวกับเรื่องนี้: /) ฉันถือว่าผลลัพธ์ชุดแรกเรียงลำดับตามชื่อไฟล์และชุดที่สองตามจำนวนคอมมิตต่อไฟล์ หน้าคนยังพูดถึงgithub.com/tj/git-extras/issuesเพื่อรายงานปัญหา
Asenar

คล้ายกับสิ่งนี้หรือไม่ blog.riff.org/…

158

คุณสามารถทำสิ่งต่อไปนี้:

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

บันทึกจะแสดงเพียงชื่อของไฟล์ที่มีการเปลี่ยนแปลงในแต่ละคอมมิตในขณะที่ส่วนที่เหลือจะจัดเรียงและส่งออกชื่อไฟล์ที่ปรากฏบ่อยที่สุด 10 อันดับแรก


คุณช่วยบอกฉันได้ไหมว่านี่ขึ้นอยู่กับสาขาปัจจุบันหรือเป็นสำหรับที่เก็บทั้งหมด แล้วสาขาที่ยังไม่รวม?
Karthick S

@KarthickS: นั่นคือสำหรับการคอมมิตในสาขาปัจจุบันเท่านั้น - คุณสามารถเพิ่ม--branchesการคอมมิตgit logในสาขาในพื้นที่ของคุณได้
Mark Longair

1
ดี. นอกจากนี้ฉันพบว่ามันรายงานไฟล์ที่ถูกลบเมื่อนานมาแล้วด้วย แก้ไขด่วนคือการ จำกัด เวลาเช่น --since = "ปีที่แล้ว"
FractalSpace

2
นอกจากนี้ยังมีประโยชน์คือการใช้--since "1 month ago"หรือตัวเลือกอื่น ๆ เพื่อ จำกัด กรอบเวลาให้แคบลง

3
พบส่วนหนึ่งของคำตอบของฉัน:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331

13

ฉันสังเกตว่าทั้ง คำตอบของ Mark และ Seheไม่ใช่--followไฟล์กล่าวคือหยุดเมื่อถึงไฟล์ที่เปลี่ยนชื่อ สคริปต์นี้จะช้าลงมาก แต่จะทำงานตามวัตถุประสงค์นั้น

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


1
ในการขยายสิ่งนี้ฉันได้สร้างgist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350 โดยจะรวบรวมการเปลี่ยนแปลงตามโฟลเดอร์โดยเฉพาะแต่ละโฟลเดอร์ในrolesไดเร็กทอรีสำหรับเคสของฉัน แต่สามารถแก้ไขได้อย่างง่ายดายเพื่อให้เหมาะกับกรณีการใช้งานของคุณ
Almenon

3

สำหรับ powershell สมมติว่าคุณติดตั้ง git bash

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

3

นี่เป็นเวอร์ชัน windows

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

จากนั้นเปิดใน 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),"")

สร้างตาราง Pivot

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

click [Count Of TYPE] -> Sort -> Sort Largest To Smallest

เพราะฉันไม่รู้มากเกี่ยวกับ excel ฉันจึงไม่เข้าใจคำแนะนำเหล่านี้
BigMiner

2
git whatchanged --all | \grep "\.\.\." | cut -d' ' -f5- | cut -f2- | sort | uniq -c | sort

ถ้าคุณเพียงต้องการที่จะเห็นไฟล์ของคุณเพิ่มไป--authorgit whatchanged --author=name --all


2

คำถามเก่า แต่ฉันคิดว่ายังคงเป็นคำถามที่มีประโยชน์มาก นี่คือตัวอย่างการทำงานใน PowerShell แบบตรง สิ่งนี้จะได้รับไฟล์ที่มีการเปลี่ยนแปลงมากที่สุด 10 อันดับแรกใน repo ของคุณตามสาขาที่คุณอยู่

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

0

นอกจากนี้เรายังสามารถค้นหาไฟล์ที่เปลี่ยนแปลงระหว่างสองคอมมิตหรือกิ่งก้านได้เช่น

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

0

สิ่งนี้อาจชัดเจน แต่ข้อความค้นหาที่ให้ไว้จะแสดงไฟล์ทั้งหมด แต่บางทีคุณอาจไม่สนใจที่จะรู้ว่าไฟล์การกำหนดค่าหรือโครงการของคุณได้รับการอัปเดตมากที่สุด grep ธรรมดาจะแยกไฟล์โค้ดของคุณตัวอย่างเช่น:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.