ฉันได้ทดลองกับการใช้ทรีย่อย git และพบกับสถานการณ์ต่อไปนี้
ฉันใช้ทรีทรี git เพื่อเพิ่มโครงการภายนอกไปยัง repo ของฉันฉันเก็บประวัติทั้งหมดของโครงการต้นน้ำอย่างตั้งใจเพราะฉันต้องการอ้างอิงประวัติของโครงการและสนับสนุนโครงการต้นน้ำในภายหลัง
ตามที่ปรากฎผู้สนับสนุนคนอื่นในโครงการต้นน้ำผลักไฟล์ขนาดใหญ่เข้าไปในสาขาหลักโดยไม่ได้ตั้งใจ ในการแก้ไขปัญหานี้โครงการอัปสตรีมจะเขียนประวัติและบังคับให้ส่งไปยังต้นแบบ เมื่อสร้าง "monorepo" ของฉันฉันได้รวมการกระทำนี้และฉันก็อยากจะลบมันด้วย
ฉันจะอัพเดตที่เก็บของฉันเพื่อสะท้อนประวัติศาสตร์ใหม่ของทรีย่อยได้อย่างไร
ความพยายามครั้งแรกของฉันคือการใช้สาขาตัวกรองเพื่อลบทรีย่อยและประวัติทั้งหมดอย่างสมบูรณ์
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
เมื่อลบทรีย่อยเวอร์ชันเก่าออกแล้วฉันสามารถเพิ่มทรีย่อยอีกครั้งโดยใช้ upstream master ใหม่ อย่างไรก็ตามสิ่งนี้ไม่ได้ผลเพราะเหตุผลบางอย่างประวัติการส่งมอบยังคงปรากฏในเอาต์พุตบันทึก git
ปรับปรุง
ฉันเขียนขั้นตอนต่าง ๆ เพื่อสร้างตัวอย่างที่จำลองได้น้อยที่สุด
สร้าง repo git ที่ว่างเปล่าก่อน
git init test-monorepo cd ./test-monorepo
สร้างความมุ่งมั่นเริ่มต้น
echo hello world > README git add README git commit -m 'initial commit'
ตอนนี้เพิ่มทรีย่อยสำหรับโครงการภายนอก
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
ให้คำมั่นสัญญากับ monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
ทีนี้ลองใช้ git filter-branch เพื่อลบทรีย่อย
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
ตรวจสอบเอาต์พุตของคอมไพล์ฉันคาดหวังว่าจะเห็นเฉพาะการคอมมิทเริ่มต้นของฉัน
git log
git gc --prune=now
ลบเฉพาะการกระทำที่ไม่ปรากฏในgit log
เท่านั้น
git log
ไม่มีข้อโต้แย้งและฉันยังเห็นความมุ่งมั่นเก่า