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.