合并并推送所有git分支

合并并推送所有git分支

问题描述:

我已经用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 = [email protected]:asfernandes/firebird.git 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    fetch = +refs/tags/*:refs/tags/* 
    push = +refs/heads/*:refs/heads/* 
    push = +refs/tags/*:refs/tags/* 

我推着所有分支这个github上与下面的bash脚本。我有本地分支机构跟踪远程分支机构。

#!/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远程分支。

这应该工作,如果我正确地读你的设置:

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> S,你也可以做这样的:

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 

其牺牲的只能运行一个实际推命令的好处有点可读性。

+0

谢谢,这似乎工作正常! – 2010-12-23 21:16:28

您可以使用SubGit项目来转换您的SVN存储库。它会将分支转换为refs/heads/,将标签转换为refs/tags/;这样你最终会得到一个通用的Git仓库,你可以像其他任何Git仓库一样将它推送到GitHub。 顺便将SubGit安装到你的SVN仓库后,你的SVN仓库将自动与你的Git仓库同步(直到你运行“subgit uninstall”),所以不需要额外的同步工作。