การสร้าง git diff --stat แสดงพา ธ ไฟล์แบบเต็ม


104

ในการทำgit diff --statบางไฟล์จะแสดงรายการด้วยพา ธ แบบเต็มจากฐานที่เก็บ แต่บางไฟล์จะแสดงรายการเป็น:

.../short/path/to/filename.  

นั่นคือเส้นทางเริ่มต้นด้วย...และแสดงเฉพาะเส้นทางสั้น ๆ

ฉันต้องการgit diffแสดงรายการเส้นทางไฟล์แบบเต็มสำหรับไฟล์ทั้งหมดเพื่อให้ประมวลผลได้ง่ายโดยสคริปต์ มีวิธีใดบ้างที่ฉันgit diffจะแสดงเส้นทางแบบเต็มได้เสมอ

คำตอบ:


109

git diffคำสั่งเตะค่าตัวเลือกสำหรับ--stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(สำหรับการเขียนสคริปต์คุณอาจต้องการใช้git diff-treeโดยตรงเนื่องจากเป็นคำสั่ง "ท่อประปา" มากกว่าแม้ว่าฉันสงสัยว่าคุณจะสบายดีก็ตามโปรดทราบว่าคุณต้องใช้ข้อความพิเศษเดียวกันกับ--statเมื่อใช้git diff-treeข้อแตกต่างที่สำคัญระหว่างการใช้git diff"เครื่องเคลือบดินเผา "ส่วนหน้าและgit diff-treeคำสั่งเกี่ยวกับท่อประปาคือgit diffค้นหาการตั้งค่าที่กำหนดไว้ของคุณสำหรับตัวเลือกต่างๆเช่นdiff.renamesการตัดสินใจว่าจะทำการตรวจจับการเปลี่ยนชื่อหรือไม่นอกจากนั้นส่วนหน้าgit diffจะเทียบเท่ากับgit diff-indexว่าคุณกำลังเปรียบเทียบการกระทำกับดัชนี ตัวอย่างเช่นกล่าวอีกนัยหนึ่งคือgit diff อ่านการกำหนดค่าของคุณและเรียกใช้ท่อประปาที่ถูกต้องโดยอัตโนมัติ )


6
git diff --numstat เหมือนกับ diff-tree
cmcginty

1
โปรดทราบว่าหากต้องการจำกัดความกว้างของส่วนสุดท้าย (+++ / ---) คุณสามารถใช้--stat-graph-width=...สวิตช์แยกต่างหาก โปรดทราบว่าการตั้งค่าสูง--stat-graph-width=และ--stat-name-width=ไม่เพียงพอคุณต้องตั้งค่าให้--stat-width=ใหญ่พอที่จะครอบคลุมทั้งสอง
jakub.g

@ jakub.g: จุดดี. จากการขุดในแหล่ง git สิ่งนี้เข้ากับ git 1.7.10
torek

4
มีวิธีใดบ้างที่จะทำให้สิ่งนี้เป็นสากล พิมพ์ทุกครั้งก็บ้า
Rudie

@Rudie: อนิจจาไม่: มีตัวแปรการกำหนดค่าที่diff.statGraphWidthคุณสามารถใช้เพื่อตั้ง--stat-graph-widthค่าได้ แต่ตัวแปรอื่น ๆ เริ่มต้นเป็นความกว้างเทอร์มินัลของคุณ (ดังนั้นคำตอบทางเลือก: "ใช่เพียงทำให้หน้าต่างเทอร์มินัลของคุณกว้าง 1,000 คอลัมน์" :-))
torek

22

สำหรับการประมวลผลสคริปต์ควรใช้อย่างใดอย่างหนึ่งต่อไปนี้:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

สิ่งเหล่านี้มีประโยชน์มากขึ้นสำหรับการประมวลผลสคริปต์ที่มีประสิทธิภาพเมื่อรวมกับ-zตัวเลือกซึ่งใช้NULเป็นตัวยุติฟิลด์


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

1
outpu git rev-parse --show-toplevelทั้งหมดจะกลับเส้นทางเทียบกับ ปัญหาเดิมอ้างถึงเส้นทางที่ถูกตัดทอนซึ่งเป็นปัญหาในสถานะต่างโดยเฉพาะอย่างยิ่งสำหรับชื่อไฟล์ที่ยาวหรือค่าต่ำสำหรับ--stat-name-width. คำสั่งข้างต้นจะไม่ตัดเส้นทาง แต่จะแสดงเส้นทาง "เต็ม" ตามที่ร้องขอแม้ว่าจะยังสัมพันธ์กับรูทที่เก็บก็ตาม
cmbuckley

18

สำหรับผู้ใช้ Bash คุณสามารถใช้$COLUMNSตัวแปรเพื่อเติมความกว้างของเทอร์มินัลที่มีอยู่โดยอัตโนมัติ:

git diff --stat=$COLUMNS

ชื่อพา ธ ที่ยาวมากอาจยังคงถูกตัดทอน ในกรณีนี้คุณสามารถลดความกว้างของส่วน +++ / --- โดยใช้--stat-graph-widthตัวอย่างเช่นซึ่ง จำกัด ไว้ที่ 1/5 ของความกว้างเทอร์มินัล:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

สำหรับโซลูชันทั่วไปคุณสามารถใช้ผลลัพธ์ของtput colsเพื่อกำหนดความกว้างของเทอร์มินัล


2
จะมีวิธีการใด ๆ โลกาภิวัฒน์--stat=$COLUMNS,$COLUMNS? พิมพ์ทุกครั้งก็บ้า
Rudie

@Rudie เพิ่มexport COLUMNSที่คุณ~/.bashrcและในของคุณ~/.gitconfigภายใต้การ[alias]เพิ่มsmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841

@ user151841 diffที่เปลี่ยนแปลงเท่านั้น ฉันต้องการให้มันทำงานเพื่อผสานและดึง ฯลฯ ด้วย (ไม่สามารถทำได้ด้วยตนเอง) ฉันไม่คิดว่า GIT รองรับ
Rudie

@Rudie อืมหลังจากการดึงหรือการผสานเสร็จสมบูรณ์คุณสามารถแตกต่างระหว่างแฮชก่อนหน้าและแฮชใหม่ได้
user151841

2
@ user151841 แน่นอน แต่การรวมแล้วให้สรุปสถิติ ไม่มีพารามิเตอร์ / config. จะเป็นการดีมากถ้า 'ข้อมูลสรุปสถิติ' ทั้งหมดใช้ config เดียวกัน
Rudie

4

มีตัวเลือก--name-only: git diff --name-only. ตัวเลือกนี้ยังได้รับการสนับสนุนโดยคำสั่งอื่น ๆ เช่นคอมไพล์และshowstash

เส้นทางไม่ได้ถูกย่อให้สั้นลงด้วยตัวเลือก


0

ฉันสร้างนามแฝง git ต่อไปนี้:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

อ่านจำนวนคอลัมน์จากtput colsคำสั่ง ค่าเริ่มต้นจะแตกต่างmasterกัน แต่คุณสามารถระบุสาขาอื่นได้

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

0

วิธีแก้ปัญหาง่ายๆที่ฉันพบคือการทำสิ่งนี้: (ใช้ได้กับ * nix เท่านั้นขออภัยไม่มี osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

เวอร์ชันนี้ใช้ได้กับทั้งสองอย่าง แต่ดูไม่ค่อยดีบน osx

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"

-1

ฉันพบว่าพฤติกรรมของ diff --stat เปลี่ยนไปที่ไหนสักแห่งรอบ ๆ git 1.7.10 โดยที่ก่อนหน้านี้จะทำให้เส้นทางไฟล์สั้นลงเป็นความกว้างคงที่ตามค่าเริ่มต้น - ตอนนี้แสดงมากที่สุดเท่าที่หน้าต่างเทอร์มินัลของคุณจะอนุญาต หากคุณกำลังประสบปัญหานี้ตรวจสอบให้แน่ใจว่าคุณได้อัปเกรดเป็น 1.8.0 หรือใหม่กว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.