2010-12-21 220 views
2

我已經用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遠程分支。

回答

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> 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

0

您可以使用SubGit項目來轉換您的SVN存儲庫。它會將分支轉換爲refs/heads/,將標籤轉換爲refs/tags/;這樣你最終會得到一個通用的Git倉庫,你可以像其他任何Git倉庫一樣將它推送到GitHub。 順便將SubGit安裝到你的SVN倉庫後,你的SVN倉庫將自動與你的Git倉庫同步(直到你運行「subgit uninstall」),所以不需要額外的同步工作。