2009-01-19 68 views
9

這裏是我的問題:追溯SVN導入Git

  1. 我用顛覆了一段時間,直到我換到Git的。經過了一段時間。
  2. 沒有從Subversion到Git的歷史導入。這是一個嚴格的結帳,刪除.svn dirs,然後git init。不是一個明智的舉動。
  3. 現在,成千上萬的git提交後,我找到了在第一次git提交時發生的Subversion repo的備份。啊哈!

我想將git回購回滾到第0天,正確導入svn回購,然後重新應用所有git更改,從而更正第一次未完成的操作。

有沒有人嘗試過?我會如何去做這件事?這聽起來像是所有基調的母親。

回答

14

聽起來像git移植的工作。這個文件有點粗略,但基本上你想要做的是這樣的:

  1. 獲得你的回購協議中的svn的git-svn副本。最簡單的方法是git svn clone in,然後在你現有的倉庫中獲取svn克隆
  2. 找出哪個基提交應該遵循svn提交。所以你可能有一個git root的地方(「Last SVN version」),它應該遵循最後一個實際的SVN版本。這是你剛剛提取的git-svn clone的頭文件
  3. 創建一個文件.git/info/grafts,並將兩個sha放在一行上。第一個是第一個git提交,然後是空間,然後是最後的svn提交。這告訴git git提交不是無父母的,但事實上最後的svn提交作爲父母。
  4. 你現在可以檢查與gitk/gitx /無論這兩個存儲庫連接
  5. 要使更改永久,運行git filter-branch。您可能首先要閱讀其手冊頁。

你當然也可以爲你所有的分支做第3步。 jpalecek的方法存在的問題是,rebase會使你的歷史變平,所以如果你有任何合併,rebase就會失去它們。過濾器分支方法可以保持您的歷史記錄不變。

+1

這正是我爲memcached所做的:http://groups.google.com/group/memcached/browse_thread/thread/a7b153bc087244b1/4023dbe7168ea5fa – Dustin 2009-01-20 00:17:05

1

我從來沒有嘗試過你想要的,但我正在做類似於CVS的事情。

基本上,我建議:

  1. 創建從SVN
  2. 歷史在這個新的倉庫一個新的git倉庫,git fetch一切從Git倉庫(以後還有沒有共同提交)
  3. 然後,git branch remote/branch branch-lastgit rebase --onto svn-last remote/branch-first branch-last,其中remote/branch-first是第一個提交您的進口git倉庫中,等

如果你有更多的分支,事情就更復雜了。我認爲重複第3步可能會做,但你最好試試自己。如果你已經合併了你的git歷史,你可能需要git rebase -i -p ...。記住,git的優點是你基本上不能搞砸任何東西(特別是如果你在一個單獨的倉庫中工作)。