I went down some dead ends trying this, but it was pretty easy in the end. Here’s how I did it, because my search keywords didn’t turn up what I was looking for first.
I have two repositories, AAA and BBB, and I want them to end up looking like below. Also, I don’t want to keep using the old repositories, but I do most definitely want to see the full history of each file.
AAA AAA/aaa-oldAAA AAA/bbb-oldBBB
Or something along those lines anyway. I chose AAA to be the new final parent, so I started by moving all the original AAA files down a level. This was straightforward
cd AAA mkdir aaa-oldAAA git mv x y z aaa-oldAAA git commit
I then did the same thing in the BBB repository.
Now, the fun, adding the other repository as a remote in this repository.
cd AAA git remote add bbb-upstream /full/path/to/old/BBB git fetch bbb-upstream git checkout -b bbb-u-branch bbb-upstream/master
This is pretty neat. Right here, you’re only looking at the code from the BBB repository! If you
git checkout master again, you’re back looking at your AAA/aaa-oldAAA repository. This makes sense when you think about it, nothing says that branches have to have the same or even related code in them.
Now, we just merge the
bbb-u-branch into our local master!
git checkout master git merge bbb-u-branch git remote rm bbb-upstream # no longer needed
Presto! Finito! The only problem I had was a merge conflict in the .gitignore files.
Note: to see the logs of files that have been moved, you need to use
git log --follow filename.blah This has nothing to do with the dual merge however.