ฉันจำเป็นต้องอ่านคำตอบหลายข้อและข้อมูลอื่น ๆ เพื่อเข้าใจว่าฉันทำอะไรอยู่
1. ละเว้นทุกสิ่งที่เก่ากว่าการส่งข้อความ
ไฟล์.git/info/grafts
สามารถกำหนดพาเรนต์ปลอมสำหรับการคอมมิต บรรทัดที่มีเพียงรหัสการกระทำกล่าวว่าการกระทำไม่มีผู้ปกครอง หากเราต้องการจะบอกว่าเราใส่ใจเฉพาะในช่วงเวลาที่ผ่านมา 2000 ครั้งเราสามารถพิมพ์:
git rev-parse HEAD~2000 > .git/info/grafts
git rev-parse ให้ค่าคอมมิตของพาเรนต์ที่ 2000 ของการคอมมิทปัจจุบัน คำสั่งดังกล่าวจะเขียนทับไฟล์ grafts หากมี ตรวจสอบว่ามันมีก่อน
2. เขียนประวัติ Git ใหม่ (ไม่จำเป็น)
หากคุณต้องการให้ผู้ปกครองปลอมที่ต่อกิ่งนี้เป็นของจริงให้รัน:
git filter-branch -- --all
มันจะเปลี่ยนรหัสกระทำทั้งหมด ทุกสำเนาของพื้นที่เก็บข้อมูลนี้จะต้องมีการปรับปรุงอย่างแข็งขัน
3. ล้างพื้นที่ดิสก์
ฉันไม่ได้ทำขั้นตอนที่ 2 เพราะฉันต้องการให้สำเนาของฉันใช้งานได้กับต้นน้ำ ฉันแค่อยากจะประหยัดเนื้อที่ดิสก์ เพื่อที่จะลืมความมุ่งมั่นเก่าทั้งหมด:
git prune
git gc
ทางเลือก: สำเนาตื้น
.git/shallow
หากคุณมีสำเนาตื้นของพื้นที่เก็บข้อมูลอื่นและเพียงต้องการที่จะประหยัดเนื้อที่ดิสก์บางอย่างที่คุณสามารถอัปเดต แต่ระวังว่าไม่มีอะไรชี้ไปที่การกระทำก่อนหน้านี้ ดังนั้นคุณสามารถเรียกใช้บางสิ่งเช่นนี้:
git fetch --prune
git rev-parse HEAD~2000 > .git/shallow
git prune
git gc
รายการในงานตื้นเช่นการรับสินบน แต่ระวังอย่าใช้กราฟต์และตื้นในเวลาเดียวกัน อย่างน้อยไม่มีรายการเดียวกันในนั้นมันจะล้มเหลว
หากคุณยังมีการอ้างอิงเก่า ๆ (แท็กกิ่งก้านหัวแบบรีโมต) ที่ชี้ไปที่การคอมมิชชันเก่าการอ้างอิงเหล่านั้นจะไม่ถูกล้างออกและคุณจะไม่ประหยัดเนื้อที่ดิสก์มากขึ้น
git filter-branch --tag-name-filter cat -- --all
เพื่ออัปเดตแท็ก แต่ฉันยังมีแท็กเก่าที่ชี้ไปยังประวัติเก่าที่ฉันต้องการลบ ฉันจะกำจัดแท็กเก่าทั้งหมดเหล่านั้นได้อย่างไรgitk --all
ถ้าฉันไม่ได้ลบพวกเขาแล้วประวัติศาสตร์เก่าไม่ได้หายไปและฉันยังคงสามารถมองเห็นได้ด้วย