ฉันต้องการกำหนดสาขา "root" ใหม่ในที่เก็บ git นี้ โดย "ราก" สาขาที่ผมหมายถึงสาขาที่เป็นอิสระทั้งหมดของทุกสาขาอื่นในพื้นที่เก็บข้อมูล1
น่าเสียดายที่แม้แต่การกระทำ (ขอเรียกมันว่าA) ที่ฐานสุดของโครงสร้างคอมมิตของ repo นั้นมีไฟล์จำนวนมาก (นี่คือที่เก็บที่เริ่มต้นในโปรเจ็กต์ที่เป็นผู้ใหญ่แล้ว)
ซึ่งหมายความว่าแม้ว่าฉันจะให้Aเป็นสาขาใหม่ แต่สาขาใหม่<start-point>นี้จะไม่เริ่มต้นจาก "กระดานชนวนที่สะอาด" แต่จะมีไฟล์ทั้งหมดที่ถูกส่งเข้าAมา
มีวิธีใดบ้างที่ฉันสามารถสร้างสาขาที่ว่างเปล่าทั้งหมดในที่เก็บนี้โดย<start-point>ให้ใกล้เคียงAที่สุด
1 BTW ไม่เทียบเท่ากับการสร้าง repo ใหม่ repos แยกกันจะสะดวกน้อยลงด้วยเหตุผลหลายประการ
แก้ไข : ตกลงนี่คือสิ่งที่ฉันทำตามคำตอบของvcsjones :
# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)
# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .
# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)
# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch
# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.
rm .git/info/grafts
แม้ว่าขั้นตอนนี้จะเกี่ยวข้องเล็กน้อย แต่ผลลัพธ์ที่ได้คือการคอมมิตฐานว่างที่สามารถใช้เป็น<start-point>"clean-slate branch" ใหม่ได้ สิ่งที่ฉันต้องทำก็คือ
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
ในอนาคตฉันจะสร้างที่เก็บใหม่เช่นนี้เสมอ:
git init
git commit --allow-empty -m 'base commit (empty)'
... เพื่อให้คอมมิตแรกว่างเปล่าและพร้อมใช้งานสำหรับการเริ่มสาขาอิสระใหม่เสมอ (ฉันรู้ว่านี่เป็นสิ่งอำนวยความสะดวกที่ไม่ค่อยจำเป็นนัก แต่ก็ค่อนข้างง่ายที่จะทำให้พร้อมใช้งาน)
git rebase --ontoโปรดดูที่stackoverflow.com/questions/645450/…