我用git-svn克隆了一个完整的std-layout subversion存储库。我的git配置定义为:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "svn"]
url = https://firebird.svn.sourceforge.net/svnroot/firebird
fetch = firebird/trunk:refs/remotes/trunk
branches = firebird/branches/*:refs/remotes/*
tags = firebird/tags/*:refs/remotes/tags/*
[remote "origin"]
url = git@github.com:asfernandes/firebird.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/tags/*:refs/tags/*
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
我正在使用下面的bash脚本将所有分支推送到此github。我有本地分支机构跟踪远程分支机构。
#!/bin/sh
git svn fetch
for x in `echo B1_5_Release B2_0_Release B2_1_Release B2_5_Release`; do git reset --hard; git checkout $x; git merge remotes/$x; done
git push --all
没有更好的方法来执行此操作,而无需检出并合并每个分支?
如果我可以在没有本地分支的情况下直接推送git-svn遥控器分支,那就更好了。
答案 0 :(得分:2)
如果我正确地阅读您的设置,这应该有效:
git svn fetch
for x in B1_5_Release B2_0_Release B2_1_Release B2_5_Release; do
git push origin remotes/$x:$x
done
这将采用remotes/B1_5_Release
并将其推送到origin/B1_5_Release
,依此类推循环中的其余分支。
由于git push
可以接受多个<refspec>
,您也可以这样做:
git svn fetch
refspecs=""
for x in B1_5_Release B2_0_Release B2_1_Release B2_5_Release; do
refspecs="$refspecs remote/$x:$x"
done
git push origin $refspecs
为了只运行一个实际的推送命令而牺牲了一点可读性。
答案 1 :(得分:0)
您可以使用SubGit项目转换SVN存储库。它会将分支转换为refs / heads / ,将标签转换为refs / tags / ;这样你最终会获得一个通常的Git存储库,你可以将其作为任何其他Git存储库推送到GitHub。 顺便说一下,在将SubGit安装到SVN存储库后,您的SVN存储库将自动与您的Git存储库同步(直到您在其上运行“subgit uninstall”),因此不需要额外的同步。