Виявляється, що відповідь набагато простіша, якщо ви просто намагаєтесь склеїти два сховища разом і зробити так, щоб все це було так, а не управляти зовнішньою залежністю. Вам просто потрібно додати пульт віддалених файлів до своїх старих репостів, об'єднати їх з новим головним майстром, перемістити файли та папки у підкаталог, здійснити переміщення та повторити для всіх додаткових репост. Підмодулі, злиття піддерева та фантазійні скасування призначені для вирішення дещо іншої проблеми і не підходять для того, що я намагався зробити.
Ось приклад сценарію 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 (який стає новим комбінованим репо), якщо ви хочете зробити це - змінити сценарій відповідно до цього.
Якщо ви хочете також запустити гілки функцій, що не працюють, скористайтеся цим:
# 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 вирівняти все правильно.
Я написав кілька більш докладне пояснення тут .