จะรับรายการไฟล์ทั้งหมดที่เปลี่ยนแปลงระหว่างสอง Git ได้อย่างไร?


178

เนื่องจากระบบราชการฉันต้องได้รับรายชื่อของไฟล์ที่เปลี่ยนแปลงทั้งหมดในที่เก็บของฉันสำหรับรายงาน (ฉันเริ่มต้นด้วยซอร์สโค้ดที่มีอยู่)

ฉันควรรันอะไรเพื่อรับรายการนี้


34
"เนื่องจากระบบราชการ" xD
ptim

คำตอบ:


238

สำหรับไฟล์ที่เปลี่ยนไประหว่าง SHA ที่กำหนดและการกระทำปัจจุบันของคุณ:

git diff --name-only <starting SHA> HEAD

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

git diff --name-only <starting SHA>

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

git diff --name-only <commit1> <commit2>

2
และถ้าคุณต้องการที่จะรู้ว่าไฟล์ที่แก้ไขโดยเฉพาะอย่างยิ่งการกระทำทำ:git diff --name-only <SHA> <SHA>^
thebugfinder

3
การใช้การ--name-statusตั้งค่าสถานะแทนที่จะ--name-onlyเป็นประโยชน์ในการรับรายการไฟล์และดูสถานะการแก้ไขเช่นเพิ่มหรือแก้ไข
Thane Plummer

@Amber ควรพูดถึง @Thane Plummer ที่--name-statusแสดงถึงสิ่งที่เกิดขึ้นกับพวกเขา
ZoltánSüle

64

หากต้องการค้นหาชื่อของไฟล์ทั้งหมดที่แก้ไขตั้งแต่การส่งครั้งล่าสุด:

git diff --name-only

หรือ (สำหรับข้อมูลเพิ่มเติมรวมถึงไฟล์ที่ไม่ได้ติดตาม):

git status

48
  • รายการทั้งหมดunstagedไฟล์การเปลี่ยนแปลงการติดตาม:

    git diff --name-only
    
  • หากต้องการแสดงรายการไฟล์ที่ถูกติดตามที่มีการจัดฉากทั้งหมด:

    git diff --name-only --staged
    
  • หากต้องการแสดงรายการไฟล์ที่ถูกเปลี่ยนสถานะและไม่ติดตามสถานะทั้งหมด:

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • หากต้องการแสดงรายการไฟล์ที่ไม่ได้ติดตามทั้งหมด (ไฟล์ที่อยู่ในรายการgit statusดังนั้นอย่ารวมไฟล์ที่ถูกละเว้น):

    git ls-files --other --exclude-standard
    

หากคุณกำลังใช้ในสคริปต์เปลือกและคุณต้องการโปรแกรมตรวจสอบอะไรถ้าคำสั่งเหล่านี้กลับมาคุณจะได้รับความสนใจในgit diffของ--exit-codeตัวเลือก


16

เมื่อฉันเพิ่ม / แก้ไข / ลบหลายไฟล์ (ตั้งแต่การคอมมิชชันล่าสุด) ฉันชอบที่จะดูการดัดแปลงตามลำดับเวลา

เพื่อที่ฉันจะใช้:

  • ในการแสดงรายการไฟล์ที่ไม่จัดฉากทั้งหมด:

    git ls-files --other --modified --exclude-standard
    
  • วิธีรับวันที่แก้ไขล่าสุดสำหรับแต่ละไฟล์:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

แม้ว่าruvimแนะนำในความคิดเห็น :

xargs -0 stat -c '%y %n' -- 
  • หากต้องการจัดเรียงจากเก่าไปเป็นล่าสุด:

    sort
    

นามแฝงทำให้การใช้งานง่ายขึ้น:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

หรือ (สั้นลงและมีประสิทธิภาพมากขึ้นขอบคุณruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

ตัวอย่างเช่น:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

ตอนนี้ฉันสามารถตรวจสอบการแก้ไขของฉันตั้งแต่เก่าไปจนถึงล่าสุด


ทำไมไม่ใช้xargsและโทรเดียวstat? สายการบินgit ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim

@ruvim ขอบคุณ ข้อเสนอแนะที่ดีมาก ฉันได้แก้ไขคำตอบเพื่อรวมความคิดเห็นของคุณเพื่อให้มองเห็นได้มากขึ้น
VonC

4

ฉันต้องการรายชื่อไฟล์ที่มีการเปลี่ยนแปลงเนื้อหาระหว่างสองคอมมิท (เพิ่มหรือแก้ไขเท่านั้น) ดังนั้นฉันจึงใช้:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

ตัวเลือก diff-filter ที่แตกต่างจากเอกสาร git diff :

diff กรอง = [(A | C | D | M | R | T | U | X | B) ... [*]]

เลือกเฉพาะไฟล์ที่เพิ่ม (A), คัดลอก (C), ลบ (D), แก้ไข (M), เปลี่ยนชื่อ (R), มีประเภทไฟล์ (เช่นไฟล์ปกติ, symlink, submodule, …) (T), เป็น Unmerged (U), ไม่ทราบ (X) หรือมีการจับคู่ Broken (B) สามารถใช้ชุดอักขระตัวกรอง (รวมถึงไม่มี) ได้ เมื่อเพิ่ม * (All-or-none) ในชุดค่าผสมเส้นทางทั้งหมดจะถูกเลือกหากมีไฟล์ใด ๆ ที่ตรงกับเกณฑ์อื่นในการเปรียบเทียบ หากไม่มีไฟล์ที่ตรงกับเกณฑ์อื่น ๆ จะไม่มีการเลือกอะไรเลย

นอกจากนี้ตัวอักษรตัวพิมพ์ใหญ่เหล่านี้สามารถลดระดับลงเพื่อยกเว้น เช่น --diff-filter = ad ไม่รวมเส้นทางที่เพิ่มและลบ

หากคุณต้องการแสดงสถานะเช่นกัน (เช่น A / M) เปลี่ยนแปลงไป--name-only--name-status


3

รายการของการแก้ไขแบบไม่มีการแก้ไขสามารถรับได้โดยใช้git statusและgrepคำสั่งด้านล่าง บางสิ่งที่ชอบgit status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....

โปรดทราบว่านี่สามารถใช้สำหรับการเปลี่ยนแปลงที่ไม่มีการกำหนดสถานะดังนั้นจึงไม่มีประโยชน์สำหรับ 'ไฟล์ที่เปลี่ยนระหว่างการคอมมิท Git สองอัน'
John Vandenberg

2

ด้วยgit showคุณจะได้รับผลลัพธ์ที่คล้ายกัน หากต้องการดูการกระทำ (เช่นเดียวกับที่git logเห็นในมุมมอง) ด้วยรายการไฟล์ที่รวมอยู่ในให้ใช้:

git show --name-only [commit-id_A]^..[commit-id_B]

[commit-id_A]คำสั่งเริ่มต้นอยู่ที่ไหนและ[commit-id_B]เป็นคำสั่งสุดท้ายที่คุณต้องการแสดง

ความสนใจเป็นพิเศษด้วย^สัญลักษณ์ หากคุณไม่ใส่ข้อมูล comm-id_A จะไม่ถูกปรับใช้


1

หากคุณต้องการตรวจสอบไฟล์ที่เปลี่ยนแปลงคุณต้องดูแลสิ่งเล็ก ๆ มากมายเช่นซึ่งจะดีที่สุดในการใช้เช่นถ้าคุณต้องการตรวจสอบว่าไฟล์ใดที่เปลี่ยนไปเพียงแค่พิมพ์

สถานะ git - มันจะแสดงไฟล์ที่มีการเปลี่ยนแปลง

ถ้าคุณต้องการทราบว่าจะทำการเปลี่ยนแปลงอะไรสามารถตรวจสอบได้ด้วยวิธีการ

git diff - จะแสดงการเปลี่ยนแปลงทั้งหมดในไฟล์ทั้งหมด

มันจะดีก็ต่อเมื่อมีการแก้ไขไฟล์เดียวเท่านั้น

และถ้าคุณต้องการตรวจสอบไฟล์โดยเฉพาะให้ใช้

คอมไพล์

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