Ternyata jawabannya jauh lebih sederhana jika Anda hanya mencoba merekatkan dua repositori bersama dan membuatnya tampak seperti itu selama ini daripada mengelola ketergantungan eksternal. Anda hanya perlu menambahkan remote ke repo lama Anda, menggabungkannya ke master baru Anda, memindahkan file dan folder ke subdirektori, melakukan perpindahan, dan ulangi untuk semua repo tambahan. Submodules, subtree merge, dan rebase mewah dimaksudkan untuk menyelesaikan masalah yang sedikit berbeda dan tidak cocok untuk apa yang saya coba lakukan.
Berikut ini contoh skrip Powershell untuk merekatkan dua repositori bersama:
# 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"
Jelas Anda malah bisa menggabungkan old_b ke old_a (yang menjadi repo gabungan baru) jika Anda lebih suka melakukannya - modifikasi skrip yang sesuai.
Jika Anda juga ingin membawa cabang fitur yang sedang dalam proses, gunakan ini:
# 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
Itu adalah satu-satunya bagian yang tidak jelas dari proses - itu bukan penggabungan subtree, melainkan argumen untuk penggabungan rekursif normal yang memberi tahu Git bahwa kami mengganti nama target dan yang membantu Git mengatur semuanya dengan benar.
Saya menulis penjelasan yang sedikit lebih rinci di sini .