git rm - fatal: pathspec ไม่ตรงกับไฟล์ใด ๆ


87

ฉันเพิ่มรูปภาพมากกว่า 9000 รูปลงในโฟลเดอร์โครงการโดยไม่ได้ตั้งใจ และมุ่งมั่นพวกเขา จากนั้นลบออกจากดิสก์ มุ่งมั่น.

ตอนนี้ฉันพยายามพุชการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์ git แต่ใช้เวลานานเกินไปและพยายามส่งข้อมูล 12 Gb

ฉันตรวจสอบขนาดไฟล์บนดิสก์และเห็นว่าจริงๆแล้ว.gitโฟลเดอร์นั้นใช้เวลา 12 Gb

จะลบรูปภาพจากที่นั่นได้อย่างไร? ฉันพยายามgit rmแต่ล้มเหลว:

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

เพราะฉันลบออกจากดิสก์แล้ว แต่มันยังอยู่ใน.gitโฟลเดอร์

ฉันพยายามเพิ่มpublic/photosใน.gitignore:

public/photos/
*.zip

แต่ไม่มีผล. แน่นอนว่าฉันสามารถทำได้hard reset headในช่วงเวลาที่ฉันไม่มีรูปถ่ายขยะมากมายในโปรเจ็กต์ของฉัน แต่ตั้งแต่นั้นเป็นต้นมาฉันก็ทำผิดหลายครั้งและทำการเปลี่ยนแปลงโค้ดมากมาย

คำตอบ:


88

ในกรณีของคุณให้ใช้git filter-branchแทนgit rm.

git rm จะลบไฟล์ในแง่ที่ว่าพวกเขาจะไม่ถูกติดตามโดย git อีกต่อไป แต่นั่นไม่ได้เป็นการลบวัตถุการกระทำเก่าที่ตรงกับภาพเหล่านั้นดังนั้นคุณจะยังคงติดอยู่กับการผลักดันคอมมิตก่อนหน้าซึ่งสอดคล้องกับรูปภาพขนาด 12GB

git filter-branchบนมืออื่น ๆ ที่สามารถลบไฟล์เหล่านั้นจากทั้งหมดกระทำก่อนหน้านี้ได้เป็นอย่างดีจึงทำไปด้วยความจำเป็นที่จะต้องผลักดัน ๆ ของพวกเขา

  1. ใช้คำสั่ง

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. หลังจากสาขาตัวกรองเสร็จสมบูรณ์ตรวจสอบว่าไม่มีไฟล์สูญหายโดยไม่ได้ตั้งใจ

  3. ตอนนี้เพิ่มกฎ. gitignore

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. ตอนนี้ทำการผลักดัน

    git push -f origin branch
    

ตรวจสอบนี้ , นี้และนี้สำหรับความช่วยเหลือเพิ่มเติม เพื่อให้ปลอดภัยยิ่งขึ้นฉันขอแนะนำให้คุณสร้างสำเนาสำรองของ repo ในระบบของคุณก่อนดำเนินการตามคำแนะนำเหล่านี้

สำหรับข้อความแสดงข้อผิดพลาด orignial ของคุณมันเกิดขึ้นเนื่องจากคุณไม่ได้ติดตามพวกเขาโดยใช้git rmและด้วยเหตุนี้ git จึงบ่นเพราะไม่สามารถลบไฟล์ที่ไม่ได้ติดตาม อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่


2
สวัสดีฉันมีปัญหาเดียวกัน แต่เมื่อพิมพ์คำสั่งในขั้นตอนที่ 1 ฉันได้รับข้อผิดพลาด: fatal: bad revision '--prune-empty' เบาะแสใด ๆ ?
kevin

@kevin ขออภัยพลาดความคิดเห็นนี้ คุณสามารถรันได้โดยไม่ต้องตั้งค่าสถานะนั้น การตัดแต่งกิ่งจะลบวัตถุการกระทำที่ว่างเปล่าออกไป
.

1
ไม่ควรgit add .gitignore && commit -m "ignore rule for photos"เป็นบรรทัดนี้git add .gitignore && git commit -m "ignore rule for photos"
โคลน

@ โคลนนิ่งใช่ควรได้รับการแก้ไขแล้ว :)

1
นี่เป็นคำตอบที่ยอดเยี่ยมมาก แก้ไขปัญหาที่ฉันพบกับ repo ของฉันมาหลายปีแล้ว ขอบคุณ!
Moshe

18

คำตอบที่ง่ายมากคือ

ขั้นตอนที่ 1:

ขั้นแรกให้เพิ่มไฟล์ที่คุณไม่ได้ติดตามซึ่งคุณต้องการลบ:

ใช้git add .หรือgit add <filename>.

ขั้นตอนที่ 2:

จากนั้นลบออกอย่างง่ายดายโดยใช้คำสั่งgit rm -f <filename>ที่นี่rm = remove และ-f = forcely


สิ่งนี้จะไม่ทำตามที่ OP ต้องการซึ่งก็คือการลบไฟล์ที่มีอยู่ในคอมมิตก่อนหน้านี้ คุณจำเป็นต้องใช้git filter-branchตามที่กล่าวไว้ที่อื่น
Simon Stevens

9

ขั้นตอนที่ 1

เพิ่มชื่อไฟล์ (s) ของ.gitignoreไฟล์

ขั้นตอนที่ 2

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all

ขั้นตอนที่ 3

git push -f origin branch

ขอขอบคุณ @mu


7
... ฉันคิดเสมอว่าคอมไพล์ยากกว่าที่ควรจะเป็นนี่เป็นข้อพิสูจน์ ไม่มีทางที่ใครจะจำการมีอยู่ของคำสั่ง git ส่วนใหญ่นับประสาอะไรกับธงและนิสัย Git model มีเหตุผลและใช้งานได้จนกว่าคุณจะทำตามขั้นตอนง่ายๆและทันทีที่คุณติดขัดคุณจะติดขัดอย่างหนัก
Muhammad Umer

2
นี่เป็นวิธีแก้ปัญหาที่เหมาะกับฉันฉันต้องการ--ignore-unmatch
guhur


1

โซ่นี้ใช้ได้ในกรณีของฉัน:

  1. git rm -r WebApplication/packages

มีการยืนยัน git-dialog คุณควรเลือกตัวเลือก "y"

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>

0
git stash 

ได้งานที่มันเรียกคืนไฟล์ที่ถูกลบฉันได้ใช้แทนrmgit rm

ฉันทำการชำระเงินแฮชล่าสุดก่อน แต่ฉันไม่เชื่อว่าจำเป็นต้องใช้


0

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

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all

จากนั้นคุณต้องเพิ่มลงในของคุณ.gitignoreเพื่อที่จะไม่ถูกติดตามต่อไป


-1

ฉันมีไดเร็กทอรีที่ซ้ำกัน (~ web / web) และมันได้ลบรายการที่ซ้ำกันที่ซ้อนกันออกเมื่อฉันทำงานrm -rf webในโฟลเดอร์เว็บแรก


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