TL;DR
I want to not only move the trunk, but also all branches to the git
remote I'm migrating from SVN to.
We have an SVN repository with a lot of branches which we want to migrate to git
. For test (and demonstrational) purposes I have set up a small SVN repository that I'm now migrating to git
. Therefore I started with
$ git svn init -t tags -T trunk -b branches --prefix=svn_origin/ svn://localhost/
$ git svn fetch
This successfully created a local git repo containing the trunk of the SVN repo. However, there was only one local branch:
$ git branch
* master
But git
still knew about the other branches:
$ git branch -a
* master
remotes/origin/master
remotes/svn_origin/Branch%2001
remotes/svn_origin/trunk
As I don't care about the local repository for now, I then wanted to push these remote branches to the new git
remote - so, after creating the remote repo and pushing my master branch to it, I tried:
$ git push --all
Everything up-to-date
So this obviously didn't work. I then tried:
$ git push origin '*:*'
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 441 bytes | 220.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/MetaColon/SVN.git
* [new branch] origin/master -> origin/master
* [new branch] svn_origin/Branch%2001 -> svn_origin/Branch%2001
* [new branch] svn_origin/trunk -> svn_origin/trunk
On first glance it seems as if it worked, but the truth is that no branch was created in my remote repo - instead the branches seem to have been pushed to svn_origin
instead of origin
(which is my git
repo).
I then tried something I had found here for fetching all branches to my local repo (I could then push them to my remote):
$ git branch -r | grep -v '->' | while read remote; do git branch --track "${remote#svn_origin/}" "$remote"; done
Branch 'origin/master' set up to track remote branch 'master' from 'origin'.
fatal: Cannot setup tracking information; starting point 'svn_origin/Branch%2001' is not a branch.
fatal: Cannot setup tracking information; starting point 'svn_origin/trunk' is not a branch.
This only fetched the master
branch, which I already had. That seems to be caused by the SVN remote not being a normal remote:
$ git remote
origin
It is at that point that the only remaining option seems to be checking out each branch manually (or via a script) and then pushing all branches from the local repository. But surely there is a simpler way?