ปรากฎว่าคำตอบนั้นง่ายกว่ามากถ้าคุณเพียงแค่พยายามที่จะยึดที่เก็บสองแห่งไว้ด้วยกันและทำให้ดูเหมือนว่ามันเป็นอย่างนั้นมาตลอดแทนที่จะจัดการกับการพึ่งพาจากภายนอก คุณเพียงแค่ต้องเพิ่มรีโมทไปยัง repos เก่าของคุณรวมไปยังมาสเตอร์ใหม่ของคุณย้ายไฟล์และโฟลเดอร์ไปยังไดเรกทอรีย่อยคอมมิชชันย้ายและทำซ้ำสำหรับ repos เพิ่มเติมทั้งหมด Submodules, ทรีทรีผสาน, และ rebases แฟนซีมีจุดมุ่งหมายเพื่อแก้ปัญหาที่แตกต่างกันเล็กน้อยและไม่เหมาะสำหรับสิ่งที่ฉันพยายามทำ
นี่คือตัวอย่างของสคริปต์ Powershell เพื่อกาวสองคลังข้อมูลเข้าด้วยกัน:
# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init
# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
git commit --allow-empty -m "Initial dummy commit"
# Add a remote for and fetch the old repo
git remote add -f old_a <OldA repo URL>
# Merge the files from old_a/master into new/master
git merge old_a/master --allow-unrelated-histories
# Move the old_a repo files and folders into a subdirectory so they don't collide with the other repo coming later
mkdir old_a
dir -exclude old_a | %{git mv $_.Name old_a}
# Commit the move
git commit -m "Move old_a files into subdir"
# Do the same thing for old_b
git remote add -f old_b <OldB repo URL>
git merge old_b/master --allow-unrelated-histories
mkdir old_b
dir –exclude old_a,old_b | %{git mv $_.Name old_b}
git commit -m "Move old_b files into subdir"
เห็นได้ชัดว่าคุณสามารถรวม old_b เข้ากับ old_a (ซึ่งจะกลายเป็น repo รวมใหม่) หากคุณต้องการทำเช่นนั้น - แก้ไขสคริปต์ให้เหมาะสม
หากคุณต้องการนำเอาฟีเจอร์ที่กำลังอยู่ในระหว่างดำเนินการให้ใช้สิ่งนี้:
# Bring over a feature branch from one of the old repos
git checkout -b feature-in-progress
git merge -s recursive -Xsubtree=old_a old_a/feature-in-progress
นั่นเป็นเพียงส่วนหนึ่งที่ไม่ชัดเจนของกระบวนการนั่นไม่ใช่การรวมทรีย่อย แต่เป็นการโต้เถียงกับการเวียนเวียนแบบเวียนที่บอก Git ว่าเราเปลี่ยนชื่อเป้าหมายและช่วยให้ Git ทุกอย่างถูกต้อง
ผมเขียนขึ้นเล็กน้อยคำอธิบายรายละเอียดเพิ่มเติมที่นี่