Subversion (SVN) is a central version control system (VCS) while Git is a distributed version control system. There are some major differences between the two, for more information consult your favorite search engine.
There are two approaches to SVN to Git migration:
SubGit is a tool for a smooth, stress-free SVN to Git migration. It creates a writable Git mirror of a local or remote Subversion repository and that way you can use both Subversion and Git as long as you like. It requires access to your GitSwarm server as it talks with the Git repositories directly in a filesystem level.
/opt
directory. The subgit
command will be available at /opt/subgit-VERSION/bin/subgit
.The first step to mirror you SVN repository in GitSwarm is to create a new empty project which will be used as a mirror. For package installations the path to the repository will be located at /var/opt/gitswarm/git-data/repositories/USER/REPO.git
by default. For source installations, the default repository directory will be /home/git/repositories/USER/REPO.git
. For convenience, assign this path to a variable:
GIT_REPO_PATH=/var/opt/gitswarm/git-data/repositories/USER/REPOS.git
SubGit will keep this repository in sync with a remote SVN project. For convenience, assign your remote SVN project URL to a variable:
SVN_PROJECT_URL=http://svn.company.com/repos/project
Next you need to run SubGit to set up a Git/SVN mirror. Make sure the following subgit
command is ran on behalf of the same user that keeps ownership of GitSwarm Git repositories (by default git
):
subgit configure --layout auto $SVN_PROJECT_URL $GIT_REPO_PATH
Adjust authors and branches mappings, if necessary. Open with your favorite text editor:
edit $GIT_REPO_PATH/subgit/authors.txt
edit $GIT_REPO_PATH/subgit/config
For more information regarding the SubGit configuration options, refer to SubGit's documentation website.
Now that SubGit has configured the Git/SVN repos, run subgit
to perform the initial translation of existing SVN revisions into the Git repository:
subgit install $GIT_REPOS_PATH
After the initial translation is completed, the Git repository and the SVN project will be kept in sync by subgit
- new Git commits will be translated to SVN revisions and new SVN revisions will be translated to Git commits. Mirror works transparently and does not require any special commands.
If you would prefer to perform one-time cut over migration with subgit
, use the import
command instead of install
:
subgit import $GIT_REPO_PATH
Running SubGit in a mirror mode requires a registration. Registration is free for open source, academic and startup projects.
We're currently working on deeper GitSwarm/SubGit integration. You may track our progress at this issue.
For any questions related to SVN to GitSwarm migration with SubGit, you can contact the SubGit team directly at support@subgit.com.
If you are currently using an SVN repository, you can migrate the repository to Git and GitSwarm. We recommend a hard cut over - run the migration command once and then have all developers start using the new GitSwarm repository immediately. Otherwise, it's hard to keep changing in sync in both directions. The conversion process should be run on a local workstation.
Install svn2git
. On all systems you can install as a Ruby gem if you already have Ruby and Git installed.
sudo gem install svn2git
On Debian-based Linux distributions you can install the native packages:
sudo apt-get install git-core git-svn ruby
Optionally, prepare an authors file so svn2git
can map SVN authors to Git authors. If you choose not to create the authors file then commits will not be attributed to the correct GitSwarm user. Some users may not consider this a big issue while others will want to ensure they complete this step. If you choose to map authors you will be required to map every author that is present on changes in the SVN repository. If you don't, the conversion will fail and you will have to update the author file accordingly. The following command will search through the repository and output a list of authors.
svn log --quiet | grep -E "r[0-9]+ \| .+ \|" | cut -d'|' -f2 | sed 's/ //g' | sort | uniq
Use the output from the last command to construct the authors file. Create a file called authors.txt
and add one mapping per line.
janedoe = Jane Doe <janedoe@example.com>
johndoe = John Doe <johndoe@example.com>
If your SVN repository is in the standard format (trunk, branches, tags, not nested) the conversion is simple. For a non-standard repository see svn2git documentation. The following command will checkout the repository and do the conversion in the current working directory. Be sure to create a new directory for each repository before running the svn2git
command. The conversion process will take some time.
svn2git https://svn.example.com/path/to/repo --authors /path/to/authors.txt
If your SVN repository requires a username and password add the --username <username>
and --password <password
flags to the above command. svn2git
also supports excluding certain file paths, branches, tags, etc. See svn2git documentation or run svn2git --help
for full documentation on all of the available options.
Create a new GitLab project, where you will eventually push your converted code. Copy the SSH or HTTP(S) repository URL from the project page. Add the GitSwarm repository as a Git remote and push all the changes. This will push all commits, branches and tags.
git remote add origin git@gitlab.com:<group>/<project>.git
git push --all origin
git push --tags origin
We welcome all contributions that would expand this guide with instructions on how to migrate from SVN and other version control systems.