2013-03-13 87 views
4

給定一個包含許多分支的大型Subversion版本庫,我想先開始使用git-svn,先克隆trunk,然後再添加特定的分支。我看到至少有三種方法可以做到這一點,但是他們中的任何一個都是「官方」的還是有最好的方法呢?在克隆git-svn中的主幹之後克隆分支的最佳方法是什麼?

假設以下佈局:

https://svn-repo.com/svn/company 
    +--core 
    | +--trunk 
    | +--branches 
    | | +--fastboot 
    | | +--playground 
    | +-tags 
    +--mobile 
     +--trunk 
     +--branches 
     +--tags 

因此,克隆只有中繼線(沒有分支機構)項目core的修訂12345:

$ git svn clone --username=svnuser -r 12345 -Ttrunk https://svn-repo.com/svn/company/core 

這將克隆項目core到的目錄同名並運行git svn rebase將拉動所有更改(修改後的12345)。此時.git/config應該有這樣的東西在裏面:

[svn-remote "svn"] 
    url = https://svn-repo.com/svn/company 
    fetch = core/trunk:refs/remotes/trunk 

到目前爲止好。現在,我們假設我想添加playground分支。這是它有點朦朧。


選項1:通過添加有分支更新中.git/config現有的遠程:

[svn-remote "svn"] 
    url = https://svn-repo.com/svn/company 
    fetch = core/trunk:refs/remotes/trunk 
    branches = core/branches/{playground}:refs/remotes/branches/* 

在這一點上,我是能夠做到:

  1. 拉分支的修訂版23456 playground

    $ git svn fetch -r 23456

  2. 創建一個本地分支,並切換到它的最新變化

    $ git checkout -b playground branches/playground

  3. 拉:

    $ git svn rebase


選項2:在.git/config添加新的遠程(除了現有的一個):

[svn-remote "playground"] 
    url = https://svn-repo.com/svn/company 
    fetch = core/branches/playground:refs/remotes/playground 

從這裏,步驟類似於的那些從選項1

$ git svn fetch playground -r 23456 
$ git checkout -b playground remotes/playground 
$ git svn rebase 

選項3:我也看到有人加入現有的遠程在一個新的獲取:

[svn-remote "svn"] 
    url = https://svn-repo.com/svn/company 
    fetch = core/trunk:refs/remotes/trunk 
    fetch = core/branches/playground:refs/remotes/branches/playground 

我並不完全確定這是否正確,或者它是否能夠正常工作。我無法找到我看到的地方。


目前,我與選項1堅持,但我真的想知道最合適的方式來做到這一點。

+0

你爲什麼不立即克隆所有的分支? – Chronial 2013-03-13 22:31:35

+1

,因爲回購超過5GB的大小,並且至少有一百個分支。 – Andrey 2013-03-13 23:05:51

回答

4

你注意到的所有選項都是有效的,並且沒有一種「規範」的方式來執行此操作,部分原因是(從git svn的觀點來看)沒有一種規範的方式來佈置Subversion存儲庫。

你選擇的選項1和3基本上是等價的。就個人而言,我已經選擇了3,但結果將與您的選項1相同。

選項2可以工作,但它會阻止Git檢測交叉分支的提交歷史記錄 - Git通常會嘗試檢測Subversion提交合並或創建分支,並將其記錄在Git提交中,但如果將兩個分支視爲完全獨立的存儲庫,則不能這樣做。

也就是說,只有在以後的日子裏增加新的分支,你纔會失去很多歷史。考慮以下流程:

  • 您的Git存儲庫僅包含git svn提取的主幹。
  • 有人從樹幹創建操場分支,在該分支中創建一些提交,然後將操場合併到樹幹。
  • 您使用git svn來獲取trunk;它看到合併,但對操作系統分支一無所知,將它作爲常規提交添加到Git存儲庫。

如果你一直在操作操作系統分支,Git會檢測到分支併合並,並記錄下來。事後添加操場分支將無濟於事,除非您使用git svn reset重新提取所有提交,因爲git svn不會重寫舊提交以注意合併。

我所做的就是直接克隆所有分支,正如Chronial在評論中提出的那樣。這是一個緩慢的過程(我已經完成了100,000個提交Subversion版本庫,包含近300個分支和標籤),可能需要幾天時間才能完成,但是您可以將其保留在後臺,當完成後有完整的Subversion歷史。