เนื่องจากระบบราชการฉันต้องได้รับรายชื่อของไฟล์ที่เปลี่ยนแปลงทั้งหมดในที่เก็บของฉันสำหรับรายงาน (ฉันเริ่มต้นด้วยซอร์สโค้ดที่มีอยู่)
ฉันควรรันอะไรเพื่อรับรายการนี้
เนื่องจากระบบราชการฉันต้องได้รับรายชื่อของไฟล์ที่เปลี่ยนแปลงทั้งหมดในที่เก็บของฉันสำหรับรายงาน (ฉันเริ่มต้นด้วยซอร์สโค้ดที่มีอยู่)
ฉันควรรันอะไรเพื่อรับรายการนี้
คำตอบ:
สำหรับไฟล์ที่เปลี่ยนไประหว่าง SHA ที่กำหนดและการกระทำปัจจุบันของคุณ:
git diff --name-only <starting SHA> HEAD
หรือถ้าคุณต้องการที่จะรวมไฟล์ที่มีการเปลี่ยนแปลง แต่ยังไม่ได้มุ่งมั่น:
git diff --name-only <starting SHA>
โดยทั่วไปแล้วไวยากรณ์ต่อไปนี้จะบอกคุณเสมอว่าไฟล์ใดมีการเปลี่ยนแปลงระหว่างสองคอมมิท (ระบุโดย SHAs หรือชื่ออื่น ๆ ):
git diff --name-only <commit1> <commit2>
git diff --name-only <SHA> <SHA>^
--name-statusตั้งค่าสถานะแทนที่จะ--name-onlyเป็นประโยชน์ในการรับรายการไฟล์และดูสถานะการแก้ไขเช่นเพิ่มหรือแก้ไข
--name-statusแสดงถึงสิ่งที่เกิดขึ้นกับพวกเขา
หากต้องการค้นหาชื่อของไฟล์ทั้งหมดที่แก้ไขตั้งแต่การส่งครั้งล่าสุด:
git diff --name-only
หรือ (สำหรับข้อมูลเพิ่มเติมรวมถึงไฟล์ที่ไม่ได้ติดตาม):
git status
รายการทั้งหมด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ตัวเลือก
เมื่อฉันเพิ่ม / แก้ไข / ลบหลายไฟล์ (ตั้งแต่การคอมมิชชันล่าสุด) ฉันชอบที่จะดูการดัดแปลงตามลำดับเวลา
เพื่อที่ฉันจะใช้:
ในการแสดงรายการไฟล์ที่ไม่จัดฉากทั้งหมด:
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
ฉันต้องการรายชื่อไฟล์ที่มีการเปลี่ยนแปลงเนื้อหาระหว่างสองคอมมิท (เพิ่มหรือแก้ไขเท่านั้น) ดังนั้นฉันจึงใช้:
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
รายการของการแก้ไขแบบไม่มีการแก้ไขสามารถรับได้โดยใช้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 showคุณจะได้รับผลลัพธ์ที่คล้ายกัน หากต้องการดูการกระทำ (เช่นเดียวกับที่git logเห็นในมุมมอง) ด้วยรายการไฟล์ที่รวมอยู่ในให้ใช้:
git show --name-only [commit-id_A]^..[commit-id_B]
[commit-id_A]คำสั่งเริ่มต้นอยู่ที่ไหนและ[commit-id_B]เป็นคำสั่งสุดท้ายที่คุณต้องการแสดง
ความสนใจเป็นพิเศษด้วย^สัญลักษณ์ หากคุณไม่ใส่ข้อมูล comm-id_A จะไม่ถูกปรับใช้
หากคุณต้องการตรวจสอบไฟล์ที่เปลี่ยนแปลงคุณต้องดูแลสิ่งเล็ก ๆ มากมายเช่นซึ่งจะดีที่สุดในการใช้เช่นถ้าคุณต้องการตรวจสอบว่าไฟล์ใดที่เปลี่ยนไปเพียงแค่พิมพ์
สถานะ git - มันจะแสดงไฟล์ที่มีการเปลี่ยนแปลง
ถ้าคุณต้องการทราบว่าจะทำการเปลี่ยนแปลงอะไรสามารถตรวจสอบได้ด้วยวิธีการ
git diff - จะแสดงการเปลี่ยนแปลงทั้งหมดในไฟล์ทั้งหมด
มันจะดีก็ต่อเมื่อมีการแก้ไขไฟล์เดียวเท่านั้น
และถ้าคุณต้องการตรวจสอบไฟล์โดยเฉพาะให้ใช้
คอมไพล์