我一直在努力将我们的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或其他工具吗?
答案 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