This process worked for me. I take no responsibility for any damage or loss incurred as a result of following or not following these steps or, for that matter, anything else you might do or not do.
- SVN is hosted at
svn.domain.com.au. - SVN is accessible via
http(other protocols should work). - GitLab is hosted at
git.domain.com.auand:- A group is created with the namespace
dev-team. - At least one user account is created, added to the group, and has an SSH key for the account being used for the migration (test using
ssh git@git.domain.com.au). - The project
favourite-projectis created in thedev-teamnamespace.
- A group is created with the namespace
- The file
users.txtcontains the relevant user details, one user per line, of the formusername = First Last <address@domain.com.au>, whereusernameis the username given in SVN logs. (See first link in References section for details, in particular answer by user Casey).
- subversion version 1.6.17 (r1128011)
- git version 1.9.1
- GitLab version 7.2.1 ff1633f
- Ubuntu server 14.04
git svn clone --stdlayout --no-metadata -A users.txt http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab masterThat's it! Reload the project page in GitLab web UI and you will see all commits and files now listed.
- If there are unknown users, the
git svn clonecommand will stop, in which case, updateusers.txt,cd favourite-projectandgit svn fetchwill continue from where it stopped. - The standard
trunk-tags-brancheslayout for SVN repository is required. - The SVN URL given to the
git svn clonecommand stops at the level immediately abovetrunk/,tags/andbranches/. - The
git svn clonecommand produces a lot of output, including some warnings at the top; I ignored the warnings.
- http://stackoverflow.com/questions/79165/migrate-svn-repository-with-history-to-a-new-git-repository/3972103
- https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/raketasks/import.md (this method didn't work for me)
- https://github.com/gitlabhq/gitlabhq/issues/4137 (describes why the above didn't work)
- https://github.com/gitlabhq/gitlab-shell/issues/32
maybe I am too late here but I created script maybe it would help anyone in need
#!/usr/bin/env sh
echo Please provide svn project repo :
read svnRepo
echo Please provide git project repo :
read gitRepo
echo Please provide svn project name :
read projectName
root="${projectName}_root"
svnDir="${projectName}_svn"
gitDir="${projectName}_git"
mkdir -p $root
cd $root
mkdir -p $svnDir
cd $svnDir
svn checkout $svnRepo
cd $projectName
svn log -q | awk -F '|' '/^r/ {sub("^ ", "",$2); sub(" $ ", "", $2); print $2" = "$2" <"$2">"}' | sort -u > ../../users.txt
cd ../../
read -p "Press [Enter] key to confirm the users.txt file is updated with valid accounts which are present in git."
mkdir -p $gitDir
cd $gitDir
git svn clone --stdlayout --no-metadata -A ../users.txt $svnRepo
cd $projectName
for t in$(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag $ {t/tags//} $t && git branch -D -r $t; done
for b in $(git for-each-ref --format='%(refname:short)' refs/remotes); do git branch $b refs/remotes/$b && git branch -D -r $b; done
git remote add origin $gitRepo
read -p "Press [Enter] key to confirm force push branches, tags into git."
git push -f --all
read -p "Press [Enter] key to quit the program."