从Subversion迁移到git,克隆所有分支并推送通过gitolite?

时间:2012-03-07 17:57:08

标签: git svn migration

我一直在努力将我们的9个项目在一个SVN回购中移动到9个单独的git回购,由gitolite在服务器上管理然后关闭SVN。其中七个很容易,因为他们没有分支或标签,所以在我的工作站上我能够做一个简单的事情:

git svn clone --stdlayout --no-metadata -A svnauthors.txt svn+ssh://user@host/var/subversion/project tempProject

然后从我的工作站推送到gitolite服务器:

 git remote add origin ssh://gitolite@host/project
 git push -u origin master

他们一直都很努力。现在最后两个项目更加困难,每个项目大约有30个标签/分支。在上面的其中一个项目中运行'git svn clone'后,我看到了:

$ git branch -a
* master
  remotes/BatchUpload
  remotes/clarify_breadcrumb
  remotes/contact_type
  remotes/contact_upload_improvements
  remotes/file_cabinet
  remotes/mobile
  remotes/summary_tiles
  remotes/summary_updates
  remotes/tags/release-2.1.2
  remotes/tags/release-3.0.1
  remotes/tags/release-3.0.2
  remotes/tags/release-3.0.2c
  remotes/tags/release-3.1.1
  remotes/tags/release-3.1.3
  remotes/tags/release-3.1.4
  remotes/tags/release-3.1.5
  remotes/tags/release-3.1.5.UPDT
  remotes/tags/release-3.2
  remotes/tags/release-3.2.1
  remotes/tags/release-3.2.2.1
  remotes/tags/release-3.2.3
  remotes/tags/release-3.2.4
  remotes/tags/release-3.2.6
  remotes/tags/release-3.2.7
  remotes/tags/release-3.2.7.1
  remotes/trunk
  remotes/user_man_batch_upload
  remotes/user_management

现在我如何将所有这些标签/分支机构下载到本地工作站,以便我可以通过gitolite推送它们并永久关闭SVN服务器?我需要在this guide做什么,为每个分支和标签做一个'git checkout -b'?我应该使用svn2git或其他工具吗?

4 个答案:

答案 0 :(得分:13)

freenode irc #git中有帮助的人给我写了一个小命令,让我的标签和分支从SVN复制到Git:

推分支:

printf "git push origin "; git show-ref | grep refs/remotes | grep -v '@' | grep -v remotes/tags | perl -ne 'print "refs/remotes/$1:refs/heads/$1 " if m!refs/remotes/(.*)!'; echo

运行打印输出的命令

推送标签:

printf "git push origin "; git show-ref | grep refs/remotes/tags | grep -v '@' | perl -ne 'print "refs/remotes/tags/$1:refs/tags/$1 " if m!refs/remotes/tags/(.*)!'; echo

运行打印输出的命令

答案 1 :(得分:2)

您可以列出从svn迁移到git时创建的所有远程引用:git show-ref(可从git 1.8.2.2获得)。然后决定将它们推向原点。

将所有引用作为分支推送到原点:

git push origin refs/remotes/*:refs/heads/*

将标签推送到原产地:

git push origin refs/tags/*:refs/tags/*
-or-
git push origin --tags

您可能需要清理这些分支,或者在推送之后 /之前清除convert some branches to tags

答案 2 :(得分:0)

他们已经在您的本地工作站上。你看到的只是对提交的引用,你可以随时查看本地分支跟踪它们。

git branch -a

显示本地存储库中的信息,而不是从远程存储库中获取任何数据。当您完成克隆时,您获得了所有这些信息。

现在我们拥有本地的所有内容,您只需要将数据推送到远程。您可以使用以下命令将所有标记推送到远程服务器:

git push --tags

对于每个分支,您可以使用以下命令将其推送到仓库:

git push origin remotes/BatchUpload:BatchUpload

答案 3 :(得分:0)

使用svn2git。这会将标签转换为git带注释的标签,然后使用这些标签正确推送     git push --tags