把SVN上的代碼倉庫遷移到Gitlab上,實際上就是把SVN倉庫轉變成Git倉庫,并且希望能保留原SVN倉庫的Commit等歷史記錄,這一點很重要。
SVN遷移到Gitlab需要安裝git-svn
# yum install -y git-svn
保留原SVN倉庫的Commit等歷史記錄,需要獲取到SVN使用的作者名字列表,為了獲得 SVN 使用的作者名字列表,可以在checkout到本地的倉庫路徑下運行這個:
# svn co --username tom --password 123456 http://my-project.googlecode.com/svn/ code
# cd code
# svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' > /root/users.txt
這會將日志輸出為 XML 格式,然后保留作者信息行、去除重復、去除 XML 標記。 然后,將輸出重定向到你的 users.txt 文件中,這樣就可以在每一個記錄后面加入對應的 Git 用戶數據,修改users.txt文件滿足以下的格式:
# vim /root/users.txt
schacon = schacon <schacon@geemail.com>
selse = selse <selse@geemail.com>
然后開始把SVN倉庫轉變成Git倉庫,執行以下命令:
# git svn clone http://my-project.googlecode.com/svn/ --authors-file=/root/users.txt --no-metadata my_project
為了將標簽變為合適的 Git 標簽,運行
# cd my_project
# cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/
# rm -Rf .git/refs/remotes/origin/tags
這會使原來在 remotes/origin/tags/ 里的遠程分支引用變成真正的(輕量)標簽。
接下來,將 refs/remotes 下剩余的引用移動為本地分支:
# cp -Rf .git/refs/remotes/* .git/refs/heads/
# rm -Rf .git/refs/remotes
現在所有的舊分支都是真正的 Git 分支,并且所有的舊標簽都是真正的 Git 標簽。 最后一件要做的事情是,將你的新 Git 服務器添加為遠程倉庫并推送到上面。 下面是一個將你的服務器添加為遠程倉庫的例子:
# git remote add origin git@my-git-server:myrepository.git
因為想要上傳所有分支與標簽,你現在可以運行:
$ git push origin --all
通過以上漂亮、干凈地導入操作,你的所有分支與標簽都應該在新 Git 服務器上,你可以去gitlab上查看結果了。