This is an example task that shows how awesome git is.
What exactly was I trying to do? I had a few ikiwiki repositories in subversion, and I decided I wanted to switch them to git. Then I figured I wanted to back them up at Github privately. Since Github limits the number of repositories and these wouldn’t take up too much room, I decided to combine them.
First thing I had to do was rewrite their history inside of a sub-folder instead of the root directory. git filter-branch to the rescue!
Had some trouble with it though because I was using a subversion import…
Rewrite 422a38a0e9d2c61098b98e6c56213ac83b7bacc2 (1/42)mv: cannot stat `/home/.../wikis/nodows/.git-rewrite/t/../index.new': No such file or directory
It was the missing trunk folder. So instead of:
git filter-branch --index-filter \ 'git ls-files -s | sed "s-\t\"*-&nodows/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
git filter-branch --index-filter \ 'git ls-files -s | sed "s-\t\"*-&nodows/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD~40..HEAD
The “40” listed above depends on the repository I’m switching and filtering. There were 42 total commits in the svn repository. I’m working on another with 256:
r256 = eb6f0f706d5109f48a4e3e46b0de69498ec5877b (refs/remotes/trunk)
I’ll try 255 first. Nope, 254 worked.
Then its as simple as:
git remote add nodows ../nodows git pull nodows
Yes, to merge two git repositories, all I had to do was add a remote reference and pull it in. The merge happens automatically, but if there are file conflicts, it will bail - hence the sub-folder task I started out with.