2010-12-21 65 views
2

我們目前使用subversion作爲我們的版本控制系統,我們已決定轉移到git。我一直很難將標準版本的Subversion系統移動到git中。我儘可能多地使用了git svn使用子模塊從SVN轉換爲Git

我需要完成的是將我們的Subversion系統轉換爲具有所有提交歷史以及標籤和分支的git。然後,爲了能夠將每個項目分成單獨的git存儲庫及其各自的歷史記錄,然後將這些單獨的存儲庫組合成子模塊。

我很感激任何關於如何最輕鬆地完成此任務的想法。

svnroot/ 
|-- branches 
|-- tags 
|-- trunk 
    |-- project A 
    |-- project B 
    `-- project C 

請和謝謝

+0

你的SVN結構是什麼? – mipadi 2010-12-21 18:59:55

+0

我已經更新了我的答案svn結構http://stackoverflow.com/questions/4502847/converting-from-svn-to-git-with-submodules/4504410#4504410 – jfs 2010-12-23 20:15:09

回答

2

如果你的SVN倉庫的佈局是:

svnroot/ 
|-- projectA 
| |-- branches 
| |-- tags 
| `-- trunk 
|-- projectB 
| |-- branches 
| |-- tags 
| `-- trunk 
`-- projectC 
    |-- branches 
    |-- tags 
    `-- trunk 

然後,你可以爲每個項目創建例如單獨的git倉庫,projectA

$ git svn clone --stdlayout https://svn.example.net/svnroot/projectA 

之後,你可以創建主要的git回購(git init)並將創建的git倉庫添加爲子模塊project{A,B,C}git submodule)。

但是它可能不是你想要的;從git submodule手冊:

子模塊允許外國庫 要被嵌入專用 子目錄源樹的內, 總是指向一個特定的提交。

他們不要與遙控器混淆,這意味着主要是爲同一項目的分支機構 ;子模塊的意思是不同的 項目,你想成爲你的源代碼樹的一部分,而 兩個項目的歷史仍然保持完全獨立,你不能 從主項目中修改子模塊的內容。

如果您想在主項目中修改project{A,B,C}並保留項目的統一歷史記錄,則子模塊不適用於該任務。


對於所提供的svn的佈局:

svnroot/ 
|-- branches 
|-- tags 
|-- trunk 
    |-- projectA 
    |-- projectB 
    `-- projectC 

嘗試創建git倉庫使用--trunk--branches--tags參數如:

$ git svn clone      \ 
> --trunk trunk/projectA   \ 
> --branches branches    \ 
> --tags tags      \ 
> https://svn.example.net/svnroot \ 
> projectA 

在完成.git/config文件應包含例如:

[svn-remote "svn"] 
     url = https://svn.example.net/svnroot 
     fetch = projectA/trunk:refs/remotes/trunk 
     branches = branches/*:refs/remotes/* 
     tags = tags/*:refs/remotes/tags/* 

您可以使用--ignore-paths=<regex>跳過項目中的匹配路徑。