2014-10-27 221 views
1

我的團隊正在準備遷移到Git,我們希望從一個小型存儲庫開始。 由於二進制文件和數百個版本分支,由git-svn創建的初始Git存儲庫大約爲10GB。SVN遷移到Git:只導入某些分支和歷史記錄

清理大文件很容易,棘手的部分似乎是分支的數量。

對於git遷移,我們想從某個時間點(X)開始,只有某些(最新的)分支。 我們沒有一個「主幹」 - 但保持在一個較長的時間段,而不是不同的版本分支:

---- Version 1 ------------------------ 
    \---------- Version 2-------------- 
       \--------- Version 3---- 

我很容易找到如何從歷史的清潔大斑點(BFG,git的過濾器 - 科)。

我的問題:

我們怎樣去掉所有分支,除了少數特定的人從歷史所以,我們只有,比如說分支「版本3」中的新鮮資料庫?理想情況下,我們希望歷史的開始,在開始提交,其中該分支的創建:

--------- Version 3---- 

有沒有辦法用git filter-branch或另一種可能可以做到這一點?

+0

導入整個倉庫到Git的遷移,然後扔掉你不感興趣的樹枝 – poke 2014-10-27 14:10:29

+0

扔掉的部分將是有趣的:d我們如何將它們扔掉並從回購歷史中消除它們? – Patrick 2014-10-27 14:12:04

回答

2

導入整個倉庫到Git的,然後扔掉你不感興趣的樹枝

扔掉的部分將是有趣的:d我們怎樣才能把它們扔掉,並從根除它們回購歷史?

好吧,Git的工作方式,分支只是指向倉庫歷史記錄中的提交。存在分支是因爲這些指針存在指向它們。如果刪除指針,分支就會消失。如果沒有其他指向那些提交,提交實質上將從存儲庫中刪除。

現在除了分支之外,還有另外一個突出的事情,通常指向提交併保持周圍:較新的提交取決於它們。 Git的歷史記錄是一個很大的非循環樹,每個提交都有父指向的提交。由此,即使沒有分支明確地指向它們,舊的承諾仍然存在;由此,整個歷史都起作用。因此如果你想擺脫整個提交行(一個單獨的分支),並且這些提交沒有在某個時間點合併到另一個分支,那麼你所需要做的就是從存儲庫中刪除該分支。那麼,什麼將指向提交的線,他們將被刪除,當你的垃圾收集的資料庫:

git branch -D Version_1 
git branch -D Version_2 
git gc --prune=now 

從倉庫中這會強制刪除分支Version_1Version_2,事後運行垃圾集合從存儲庫中刪除沒有指向它的指針的每個對象。

之後,您完全有剩餘的Version_3的歷史記錄,包括其他兩個版本的歷史記錄中的部分。如果你想刪除它,你可以應用this question中解釋的方法刪除版本3的分支點之前的舊歷史。

2

我知道這是幾年後,但如果有人正在尋找回答只選擇幾個分支,不涉及克隆整個事情:

初始化git的回購與文件夾SVN URL的tmp

git svn init -T <main_branch_name> <repo_url> tmp 

更新了「git的/配置」文件來克隆只有特定的分支。 在這種情況下,我們要克隆與模式相匹配feature*

[svn-remote "svn"] 
    noMetadata = 1 
    url = <repo_url> 
    fetch = trunk:refs/remotes/origin/trunk 
    branches = branches/feature*:refs/remotes/origin/* ## Added line 

,現在你可以從SVN倉庫獲取文件分支

git svn fetch -r $NUMBER:HEAD 

的更多信息: