合并并推送所有git分支

时间:2010-12-21 21:07:38

标签: git git-svn

我用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遥控器分支,那就更好了。

2 个答案:

答案 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”),因此不需要额外的同步。