簡體   English   中英

將兩個svn路徑遷移到新的單個git存儲庫

[英]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已創建了每個文件。 它還將XZ視為在完整的樹中創建了所有文件,因此,如果將它們重新組合在一起,則將出現持續沖突(如果目錄結構匹配)或所有文件的重復副本(如果目錄結構不匹配)不匹配)。

相反,您可能應該重新選擇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%知道存儲庫的歷史記錄, svnevereverhttp://blog.hartwork.org/?p=763 svneverever是將SVN存儲庫遷移到Git時調查其歷史記錄的好工具。


盡管開始使用git-svn更容易,但是還有以下一些原因,為什么除了使用它的靈活性之外,使用KDE svn2git代替git-svn更為優越:

  • svn2git更好地重建歷史記錄(如果使用了正確的歷史記錄),尤其是對於具有分支和合並等更復雜歷史記錄的情況
  • 標簽是真實標簽,不是Git中的分支
  • 使用git-svn標簽會包含一個額外的空提交,這也會使它們不成為分支的一部分,因此,在您將--tags給命令之前,正常的fetch不會獲取它們,因為默認情況下,還會僅獲取指向獲取的分支的標簽。 帶有正確的svn2git標簽是它們所屬的位置
  • 如果您在SVN中更改了布局,則可以輕松地使用svn2git配置,而使用git-svn最終會丟失歷史記錄
  • 使用svn2git您還可以輕松地將一個SVN存儲庫拆分為多個Git存儲庫
  • 或將同一SVN根目錄中的多個SVN存儲庫輕松組合到一個Git存儲庫中
  • 正確的svn2gitgit-svnsvn2git

您會看到git-svn較差而KDE svn2git較差的原因很多。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM