2009-01-21 146 views
144

有沒有辦法在我的Git倉庫中添加一個Subversion倉庫作爲Git子模塊?是否有可能將Subversion存儲庫作爲Git子模塊?

喜歡的東西:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project 

https://svn.foo.com/svn/proj點Subversion庫。

我知道有git-svn它允許人們與Subversion存儲庫進行交互。所以我在想,也許有一種方法可以用git-svn簽出一個Subversion版本庫,然後將它作爲子模塊使用。

回答

121

不需要。您最好的選擇是在專用的git存儲庫中設置svn存儲庫的鏡像。

git svn clone -s http://subversion.example.com/ mysvnclone 
cd mysvnclone 
git remote add origin [email protected]:project.git 
git push origin master 

然後你就可以作爲子模塊添加git倉庫到原始項目

cd /path/to/gitproject 
git submodule add git://example.com/project.git -- svn-project 
git add svn-project 
git commit -m "Add submodule" 

有SVN之間的一個概念上的差異:外部組件和git子模塊,如果你從接近這一點,可能你絆倒顛覆的觀點。 git子模塊與您提供的修訂相掛鉤。如果「上游」更改,則必須更新子模塊的參考。

所以,當我們重新同步與上游顛覆:

cd /path/to/mysvnclone 
git svn rebase 
git push 

... Git項目將仍然使用我們之前犯下的原始版本。要更新的svn HEAD,你將不得不使用

cd /path/to/gitproject/svn-project 
git checkout master 
git pull 
cd .. 
git add svn-project 
git commit -m"Update submodule" 
+1

你試過後它來這裏之前這些代碼?子模塊在git svn中無法正常工作。 – xhan 2010-12-22 09:22:32

+3

@xhan是的,我不主張在同一個存儲庫中混合git-svn和子模塊。使用git-svn的克隆只是創建svn存儲庫的本地git克隆的橋樑。 – richq 2010-12-22 09:58:25

+0

對不起。我還沒有找到你使用兩個文件夾作爲子模塊。好戲。 – xhan 2010-12-22 13:43:54

0

活塞被改寫,以支持這一點,相反的,加上在Subvresion repoistory和混帳混帳+現有的Subversion的URL。

結賬the piston Github repository

不幸的是它似乎沒有被釋放。

7

我剛剛經歷過這個。我正在做類似rq的事情,但略有不同。 我設置了一臺服務器來託管我需要的svn回購站的這些git克隆。在我的情況下,我只想要只讀版本,並且需要服務器上的裸回購。

在服務器上我運行:

GIT_DIR=<projectname>.git git init 
cd <projectname>.git/ 
GIT_DIR=. git svn init svn://example.com/trunk 
GIT_DIR=. git svn fetch 
git gc 

這就建立了我裸露的回購協議,那麼我有一個cron腳本來更新它:

#!/usr/bin/python 

import os, glob 

GIT_HOME='/var/www/git' 

os.chdir(GIT_HOME) 
os.environ['GIT_DIR']='.' 
gits = glob.glob('*.git') 
for git in gits: 
    if not os.path.isdir(git): 
    continue 
    os.chdir(os.path.join(GIT_HOME, git)) 
    if not os.path.isdir('svn/git-svn'): 
    #Not a git-svn repo 
    continue 

    #Pull in svn updates 
    os.system('git svn fetch && git gc --quiet') 
    #fix-svn-refs.sh makes all the svn branches/tags pullable 
    os.system('fix-svn-refs.sh') 
    #Update the master branch 
    os.system('git fetch . +svn/git-svn:master && git gc --quiet')` 

這也需要解決 - svn的 - 裁判。從http://www.shatow.net/fix-svn-refs.sh 這SH主要是受啓發:http://gsocblog.jsharpe.net/archives/12

我爲什麼在這裏需要git gc不知道,但我不沒有它就能做git pull

因此,畢竟你可以使用gq子模塊遵循rq的指示。

4

除了rq所說的,另一種方法是使用第三方「外部」項目(http://nopugs.com/ext-tutorial),它更好地模仿svn外部引用的工作方式。藉助外部資源,您可以跟蹤git或svn存儲庫,並且將更改上傳到這些回購更容易。但是,它要求項目成員下載並安裝單獨的軟件包。

我還沒有使用子模塊或外部;然而,我花了幾個小時閱讀所有的選擇,它看起來像外部會更適合我的需要。在Jon Loeliger(http://oreilly.com/catalog/9780596520120)的「使用Git進行版本控制」第15章中對這些和其他自定義方法進行了很好的討論,我強烈建議。

5

當前git-svn不支持svn:externals。但也有其他兩個工具,它可以幫助你:

  1. SubGit

    SubGit是服務器端解決方案,它使Git的訪問Subversion存儲庫,反之亦然。你可以參考documenation更多的細節,但在總體上是相當容易使用SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO 
    

    上面的命令將檢測分支在SVN項目的佈局,然後將創建一個空的裸Git倉庫準備鏡像SVN項目。除非這些信息已存儲在〜/ .subversion目錄下的SVN憑證緩存中,否則系統可能會要求您提供憑據。您還可以調整$GIT_REPO/subgit/authors.txt將SVN作者姓名映射到Git身份。

    $ subgit install $GIT_REPO 
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL 
    

    在這一刻你有Subversion版本庫連接到新創建的Git存儲庫。 SubGit將SVN修訂版翻譯爲每個svn commit上的Git提交,並將Git提交至每個git push上的SVN修訂版。

您需要做的一切事情是讓Git存儲庫可用於提交者。看看這個git-http-backend。然後你可以添加創建的Git倉庫作爲一個通常的子模塊。 SubGit也可以作爲Bitbucket服務器的附加組件,以瞭解更多檢查here。 因此,不需要使用任何外部工具,如git-svn或任何其他。

SubGit是專有軟件,但它對小公司(最多10個提交者),學術和開源項目是免費的。

  • SmartGit

    SmartGit取代GIT中 - svn的上客戶端。有關其功能的更多信息,您可能會發現here

    特別SmartGit不支持git的子模塊的svn:externals的,你可以在你的倉庫混合。

    SmartGit是專有軟件,但它是免費的非商業用途。

  • 0

    那麼,有git-remote-testsvn,所以我想是這樣

    git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \ 
        module/bzquips 
    

    應該工作。可以?

    相關問題