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.au
and:- 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 [email protected]
). - The project
favourite-project
is created in thedev-team
namespace.
- A group is created with the namespace
- The file
users.txt
contains the relevant user details, one user per line, of the formusername = First Last <[email protected]>
, whereusername
is 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 [email protected]:dev-team/favourite-project.git
git push --set-upstream gitlab master
That'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 clone
command will stop, in which case, updateusers.txt
,cd favourite-project
andgit svn fetch
will continue from where it stopped. - The standard
trunk
-tags
-branches
layout for SVN repository is required. - The SVN URL given to the
git svn clone
command stops at the level immediately abovetrunk/
,tags/
andbranches/
. - The
git svn clone
command 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."