ฉันจะแสดงรายการไฟล์ที่ถูกลบทั้งหมดในที่เก็บ Git ได้อย่างไร?


304

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


สำหรับทุกคนที่สะดุดเมื่อคำตอบนี้ แต่เพียงมองหาเพื่อดูรายชื่อของไฟล์เพิ่มเปลี่ยนชื่อลบแก้ไข ฯลฯ git diff --name-status commit_hashจากที่หนึ่งกระทำกัญชาหรือสาขาอื่นทำเช่นนี้:
Gabriel Staples

คำตอบ:


409
git log --diff-filter=D --summary

ดูที่ค้นหาและกู้คืนไฟล์ที่ถูกลบในที่เก็บ Git

หากคุณไม่ต้องการข้อมูลทั้งหมดเกี่ยวกับการกระทำที่ถูกลบไปคุณสามารถเพิ่มgrep deleteได้

git log --diff-filter=D --summary | grep delete

13
คำเตือน:รายการนี้จะแสดงไฟล์ใด ๆ ที่คุณลบไปแล้ว หากคุณลบไฟล์แล้วสร้างไฟล์ใหม่ด้วยชื่อเดียวกันไฟล์นั้นจะปรากฏในรายการนี้แม้ว่าจะมีไฟล์ที่มีอยู่
TJ Crowder

24
คุณควรดูคำสั่งgit whatchangedด้วย มันเจ๋งมาก
Mr.Black

6
นี่จะแสดงรายการการเปลี่ยนชื่อเป็นลบด้วย หากต้องการข้ามการใช้งานเหล่านี้git log --find-renames --diff-filter=D --summary | grep delete
Slaven Rezic

2
ด้วยการตรวจจับ git 2.9 ของการเปลี่ยนชื่อถูกเปิดใช้งานโดยค่าเริ่มต้น หากต้องการดูสิ่งเหล่านี้อีกครั้งเมื่อการลบใช้git log --no-renames --diff-filter=D --summary | grep delete
Michael Große

2
ระวังการใช้grep deleteเพราะถ้าข้อความคอมมิชชันมีคำว่า delete มันก็จะถูกเลือกเช่นกัน ใช้grep 'delete mode'แทน
Vadim


37

หากคุณสนใจที่จะเห็นไฟล์ที่ถูกลบในปัจจุบันเท่านั้นคุณสามารถใช้สิ่งนี้:

git ls-files --deleted

ถ้าคุณต้องการที่จะลบพวกเขา (ในกรณีที่คุณลบพวกเขาไม่ได้ใช้ "git rm") ไปป์ที่ส่งผลให้ xargs git rm

git ls-files --deleted | xargs git rm

11
สิ่งนี้แสดงเฉพาะไฟล์ในดัชนีที่ถูกลบในสำเนาการทำงาน OP ต้องการไฟล์ทั้งหมดที่เคยถูกลบ
Max Nanasy สูงสุด

1
หรือgit rm $(git ls-files --deleted)
yunzen

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

10

อ้างนี้คำตอบที่กองมากเกิน

เป็นวิธีที่ค่อนข้างเรียบร้อยในการรับการเปลี่ยนแปลง(A: เพิ่ม, M: แก้ไข, D: ลบ)สำหรับแต่ละไฟล์ที่มีการเปลี่ยนแปลง

git diff --name-status

4

และหากคุณต้องการ จำกัด ผลลัพธ์อย่างใดอย่างหนึ่ง

$ git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'
delete mode 100644 blah/some_dir/file1 d3bfbbeba5b5c1da73c432cb3fb61990bdcf6f64
delete mode 100644 blah/some_dir/file2 d3bfbbeba5b5c1da73c432cb3fb61990bdcf6f64
delete mode 100644 blah/some_dir/file3 9c89b91d8df7c95c6043184154c476623414fcb7

คุณจะได้รับไฟล์ทั้งหมดที่ถูกลบจากsome_dir(ดูคำสั่ง sed) พร้อมกับหมายเลขการกระทำที่เกิดขึ้น sed regex ใด ๆ ที่จะทำ (ฉันใช้สิ่งนี้เพื่อค้นหาประเภทไฟล์ที่ถูกลบ ฯลฯ )


2
ฉันเชื่อว่าเป็นวิธีที่ซับซ้อนที่จะเป็นประโยชน์ในชีวิตนักพัฒนารายวัน แต่หากคุณต้องการแสดงรายการไฟล์ที่ถูกลบออกจากไดเรกทอรีปัจจุบันให้ทำดังนี้:git log --diff-filter=D .
Sebi

กรณีที่ฉันมีคือไดเรกทอรีถูกลบและฉันเพิ่งเป็นส่วนใหม่ของชื่อ
estani

4

เนื่องจาก Windows ไม่มีgrepคำสั่งจึงเหมาะสำหรับฉันใน PowerShell:

git log --find-renames --diff-filter=D --summary | Select-String -Pattern "delete mode" | sort -u > deletions.txt

คือSelect-Stringอะไร
MarcusJ

1
มันเป็น PowerShell cmdlet ดูdocs.microsoft.com/en-us/powershell/module/ …
James Skemp

Windows มีFINDและFINDSTRแม้ว่าฉันต้องยอมรับว่าไม่เคยใช้ การติดตั้งGit Bashเป็นวิธีที่ง่ายที่สุด ทางเลือกคือป่องCygwin
Peter Mortensen

4

แสดงไฟล์ที่ถูกลบทั้งหมดในsome_branch

git diff origin/master...origin/some_branch --name-status | grep ^D

หรือ

git diff origin/master...origin/some_branch --name-status --diff-filter=D 

2
สิ่งนี้จะไม่ทำงานเพราะมันจะมีไฟล์ทั้งหมดที่มี D อยู่ คุณจำเป็นต้องมีสิ่งที่ต้องการgit diff origin/master...origin/some_branch --name-status | grep ^Dหรือgit diff origin/master...origin/some_branch --name-status --diff-filter=D
nathaneastwood

1

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

git log --diff-filter=D --summary | grep "delete mode 100" | cut -c 21- | sort > deleted.txt

ทำงานใน msysgit (2.6.1.windows.1) โปรดทราบว่าเราต้องการ "ลบโหมด 100" เนื่องจากไฟล์คอมไพล์อาจถูกคอมมิทเป็นโหมด 100644 หรือ 100755

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