This guide will demonstrate how to mirror an SVN into a Git repo. You're the target audience if you're an SVN user, just getting started with Git and need to coax your project team over to Git.
The branching scenario has been simplified for clarity.
First off, I'll give some credits. I've lifted all this information from various placed on the web. You should probably follow these links for better instruction. :)
- http://help.github.com/mac-set-up-git
- http://swik.net/Rails/Robby+on+Rails/git-svn+is+a+gateway+drug/cboew
We'll start assuming that you
- Have installed Git
- Have an SVN repo with standard layout (trunk, branches, tags)
- Can type into a terminal
We'll also assume that SVN trunk is your integration branch, and that SVN branches/production contains the production code.
# Clone an SVN repo with Git
git svn init -s http://svn.yourdomain.com/repos/project_name
cd project_name
# Fetch the SVN branches to the local Git repo
git svn fetch
# Once this is done, you’re local 'master' branch is linked to trunk/.
# Make a new branch for develop & check it out
git checkout -b develop
# Back to master.
git checkout master
# We'll change this to link local 'develop' branch to trunk
git reset --hard production
If you'd like to see how your branches are organized you can view all branches
# Show current branches
git branch -va
Now we have Git branches properly mapped to SVN branches. But, so far there's only a relationship with the SVN repository. We need to create another relationship to the Git repo.
You can use an existing Git repository, or create a new one. In either case, you'll need the remote Git URL to add the remote. You can name the remote anything you'd like, but the default remote name is 'origin'.
# Add a Git remote
git remote add origin git@github.com:guidance/emergencylink.git
Once things are configured, it's a matter of keeping the git mirror up to date.
The basic procedure looks like this:
git checkout develop // Switch to develop branch
get svn rebase // Get latest stuff from SVN repository
# Push changes to git remote
# git push <repository> <branch>
git push origin develop // Send code to Github repository
At some point you'll want to get your code into production. We'll assume that you're going to use git to merge the whole thing over to master. (This is a much-too-simple worldview, but source control strategy and workflow isn't in scope of this article.)
# In git, merging pulls code from another branch into the current branch:
# git merge <branch_to_merge_from>
git checkout master
git merge develop
git push origin master
@farOverNinethousand There is too many blocks and pitfalls on the road of a full SVN-to-Git mirroring. One of these are
svn:externals
. There is no a reliable way to mirror them because it requires a remote repo creation on a Git hub or server. There is no such functionality in the Git, because it is a part of a hub. All you can do is write down a script to map allsvn:externals
to Git branches or external repos, but that is not easy either. I can recall only one script that has tried to acquire this:https://support.tmatesoft.com/t/script-for-conversion-of-svn-externals-to-git-submodules/2980
https://github.com/newren/git-filter-repo/blob/main/contrib/filter-repo-demos/convert-svnexternals
And there won't be any duplex mode. If you commit and pushed something to the Git manually, then you have to manually port it back to the SVN.