[英]Migrating two svn paths to a new single git repository
我正試圖計划在本周末完成從SVN到git的遷移,並且正在努力遷移我們的所有歷史記錄。
我們的代碼當前在SVN中為http:// server / svn / repos / projectName / trunk /
我可以做到以下大部分事情:
git svn init http://server/svn/repos/projectName/trunk/ --no-metadata
git config svn.authorsfile users.txt
git svn fetch
我們將永久遷移到git,並且還沒有引用任何修訂號,因此--no-metadata,我們也不關心遷移分支。
這在大多數情況下都有效,但是我們的項目最初位於http:// server / svn / repos / trunk / oldProjectName中
該存儲庫包含其他幾個項目,我們僅對遷移其中一個感興趣。 有沒有一種方法來創建新的git存儲庫,其中包含來自http:// server / svn / repos / trunk / oldProjectName的提交,然后包含http:// server / svn / repos / projectName / trunk /的提交?
我知道這行不通,但是它展示了我想要實現的目標:
git svn init http://server/svn/repos/trunk/oldProjectName
git config svn.authorsfile users.txt
git svn fetch
git svn init http://server/svn/repos/trunk/oldProjectName
git svn fetch
我相信答案在於手動創建兩個遙控器,一個用於舊的svn路徑,一個用於新的svn路徑。 我設法做到了這一點,並認為下一步涉及將基礎彼此重合嗎?
(盡管我在Windows上,但仍可以(並且很舒適)根據需要使用bash)
我不知道問題的git svn
部分; 從您所說的內容來看,我不清楚您是否設法將提交合並到單個存儲庫中,而只是需要將歷史記錄縫合在一起,還是仍在努力將它們放入單個存儲庫中。
在單個倉庫中獲取提交
也許有一種更有效的方法(再次,我不太了解git svn
),但是最壞的情況是您可以將第二個svn存儲庫導入到第二個git存儲庫中,然后將第二個git repo設置為第一個git的遠程存儲庫:
git remote add oldproject ../oldproject
git fetch
那你應該有
A --- B --- C <--(master)
X --- Y --- Z <--(oldproject/master)
拼接歷史
最有可能你不想變基。 A
沒有父級,但包含完整的樹,這意味着git認為A
已創建了每個文件。 它還將X
到Z
視為在完整的樹中創建了所有文件,因此,如果將它們重新組合在一起,則將出現持續沖突(如果目錄結構匹配)或所有文件的重復副本(如果目錄結構不匹配)不匹配)。
相反,您可能應該重新選擇filter-branch
。 您可能想通讀git filter-branch
文檔,但是他們為這種類型的操作提供的簡單示例是
echo "$commit-id $graft-id" >> .git/info/grafts
git filter-branch $graft-id..HEAD
請記住,在選擇$graft-id
(“最近”歷史記錄的根目錄提交)和$commit-id
(“舊”歷史記錄的標題提交)時,如果歷史記錄重疊,則可能需要進行相應的調整。 例如,如果您有
D' --- E' --- F --- G --- H <--(master)
A --- B --- C --- D --- E <--(oldproject/master)
那么您可以使用F
作為嫁接ID(並使用E
作為提交ID), 或使用D'
作為嫁接ID(並使用C
作為提交ID)。
對於一次性遷移, git-svn
不是轉換存儲庫或部分存儲庫的正確工具。 這是一個偉大的工具,如果你想使用Git的作為前端為現有的SVN服務器,但對於一次性轉換,你不應該使用git-svn
,但svn2git
這是該用例更加適合。
有很多名為svn2git
工具,可能最好的一種是來自https://github.com/svn-all-fast-export/svn2git的KDE工具。 我強烈建議您使用該svn2git
工具。 這是我所知道的最好的,它可以很靈活地處理其規則文件。
您將能夠輕松配置svn2git
的規則文件,以從當前SVN布局中生成所需的結果,包括可能存在的任何復雜歷史記錄,以及從一個SVN存儲庫中生成多個Git存儲庫,或將不同的SVN存儲庫組合到一個Git存儲庫中干凈地
如果您不是100%知道存儲庫的歷史記錄, svneverever
從http://blog.hartwork.org/?p=763 svneverever
是將SVN存儲庫遷移到Git時調查其歷史記錄的好工具。
盡管開始使用git-svn
更容易,但是還有以下一些原因,為什么除了使用它的靈活性之外,使用KDE svn2git
代替git-svn
更為優越:
svn2git
更好地重建歷史記錄(如果使用了正確的歷史記錄),尤其是對於具有分支和合並等更復雜歷史記錄的情況 git-svn
標簽會包含一個額外的空提交,這也會使它們不成為分支的一部分,因此,在您將--tags
給命令之前,正常的fetch
不會獲取它們,因為默認情況下,還會僅獲取指向獲取的分支的標簽。 帶有正確的svn2git標簽是它們所屬的位置 svn2git
配置,而使用git-svn
最終會丟失歷史記錄 svn2git
您還可以輕松地將一個SVN存儲庫拆分為多個Git存儲庫 svn2git
比git-svn
快svn2git
倍 您會看到git-svn
較差而KDE svn2git
較差的原因很多。 :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.