การล้างไฟล์จาก Git repo ล้มเหลวไม่สามารถสร้างข้อมูลสำรองใหม่ได้


117

ฉันพยายามลบไฟล์ออกจาก repo ระยะไกลโดยเรียกใช้:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

แต่ Git บ่นว่า

ไม่สามารถสร้างข้อมูลสำรองใหม่ การสำรองข้อมูลก่อนหน้านี้มีอยู่แล้วใน refs / original /
Force เขียนทับข้อมูลสำรองด้วย -f
rm: ไม่สามารถลบ /.git-rewrite/backup-refs: Permission ปฏิเสธ
rm: ไม่สามารถลบไดเร็กทอรี /.git-rewrite: Directory not empty

หลังจากที่ฉันลบไดเร็กทอรี. git-rewrite บน Windows ไปแล้ว

ฉันจะลบไฟล์นั้นได้อย่างไร มันเป็นไฟล์ขนาด 29Mb ที่อยู่ใน repo ของฉันดังนั้นฉันจึงจำเป็นต้องลบไฟล์ออก

ฉันพยายามลบคอมมิตในgit rebase -iแต่เห็นได้ชัดว่าเนื่องจากคอมมิตแตะไฟล์ต่างๆจำนวนมาก Git บ่นว่ามีความขัดแย้งและฉันก็ยกเลิกเพื่อความปลอดภัย


1
สำหรับเครื่องมือค้นหา: .git-rewrite already exists, please remove itนอกจากนี้ยังอาจมีผลเมื่อเกิดข้อผิดพลาดของคุณ
Drew Noakes

คำตอบ:


220

คุณได้ดำเนินการกรองสาขาแล้ว หลังจาก filter-branch แล้ว Git จะยังคงอ้างถึงการกระทำแบบเก่าในกรณีที่มีบางอย่างผิดพลาด

.git/refs/original/…คุณสามารถค้นหาผู้ที่อยู่ใน ลบไดเร็กทอรีนั้นและไฟล์ทั้งหมดภายในหรือใช้-fแฟล็กเพื่อบังคับให้ Git ลบการอ้างอิงเก่า

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

10
ในที่สุดก็ใช้งานได้ขอบคุณ! ฉันลองแฟล็ก -f แล้ว แต่ปัญหาคือฉันวางไว้ที่ท้ายคำสั่งเช่น หัว -f. เมื่อเห็นคำสั่งของคุณทำให้ฉันลองตั้งค่าสถานะในตอนเริ่มต้นและได้ผล! = D
Cardin

12
แฟล็กตัวเลือก ( -f) ไปก่อน refs ( HEAD) อ้างอิงไปล่าสุด
knittl

ฉันยังคงได้รับข้อผิดพลาดเดิมหลังจากเพิ่ม -f AND ลบไดเร็กทอรี ความคิดใด ๆ ?
Yaron

1
@knittl git addผมไม่ได้หมายถึง ฉันได้รับข้อผิดพลาดเดียวกันกับโปสเตอร์ต้นฉบับแม้ว่าจะลบ.git/refs/original/โฟลเดอร์และใช้-fแฟล็กในgit filter-branchคำสั่งแล้วก็ตาม วิธีแก้ปัญหาในกรณีของฉันคือการลบ.git/packed-refsไฟล์
Yaron

1
@knittl ฉันพบวิธีการแก้ไข แต่ไม่พบว่าปัญหาคืออะไร โดยพื้นฐานแล้วฉันเพิ่ม--ignore-unmatchคำสั่งgit rmและมันก็ราบรื่น!
Gabrielius

21

ใช้คำสั่งนี้เพื่อลบข้อมูลสำรองเดิม:

git update-ref -d refs/original/refs/heads/master

นี่คือสาระสำคัญที่ฉันใช้ในการกรองแยกสาขา git repo ของฉัน: https://gist.github.com/k06a/25a0214c98bc19fd6817


นี่คือทางออกที่เหมาะสมในการลบข้อมูลสำรอง! การลบ.git/refs/original/ไม่ได้ช่วยแก้ปัญหา
Erik Koopmans

อย่าลืมเปลี่ยน 'master' เป็นสาขาที่คุณกำลังพยายามแก้ไข .. ในกรณีของฉัน "พัฒนา"
Damian Green

git show-ref | awk '/ refs.original.refs/{print$2}'เพื่อค้นหาข้อมูลสำรองทั้งหมดที่ repo ของคุณมี
แดน

4

ฉันมีปัญหาเดียวกันและคำตอบข้างต้นไม่สามารถแก้ไขได้ ไม่มีไดเรกทอรี. git / refs / original / เหลืออยู่ วิธีแก้ปัญหาสำหรับฉันคือลบไฟล์. git / packing-refs


ปัญหาเดียวกัน. .git/packed-refsอย่างไรก็ตามไม่มีไฟล์และไม่มีโฟลเดอร์originalใน.git/refs. ใคร?
XedinUnknown

แก้ไขได้ที่นี่โดยการเพิ่ม-rแฟล็กในคำสั่ง
XedinUnknown

ปัญหาเดียวกันที่นี่ การลบรหัสที่บรรจุช่วยแก้ปัญหาได้ แต่มันก็ทำลายไดเรกทอรี git ที่เหลือของฉันด้วยและฉันต้องกู้คืนจากการสำรองข้อมูล
Kevin Yin

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