2012-10-17 74 views
14

我正在嘗試使用svn2git將SVN項目遷移到git。然而,我保存所有歷史的問題。原因似乎是因爲後備箱過去了。我使用的命令是:當主幹移動時,我如何在Git中保存SVN歷史記錄?

$ svn2git http://mysvnserver.com/myproject/iPhone/ --no-minimize-url --authors ../authors.txt 

但這只是給了我歷史可以追溯到2011年至2010年實際開工項目看這樣的預計開始:

myproject 
    trunk 
    branches 
    tags 

但在2011年它被改爲:

myproject 
    iPhone 
    trunk 
    branches 
    tags 
    Android 
     trunk 
     branches 
     tags 

舊的主幹和分支根據iPhone目錄。我從這個舉動完成的歷史開始。如果我在iPhone目錄中做svn log,我會得到縮短的歷史記錄。但是,如果我cd trunk; svn log那麼我會得到完整的歷史。

我不知道如何獲得這個歷史。我的想法是以某種方式創建一個僅具有主幹歷史的git存儲庫,然後我會在主回購庫中將其作爲分支,然後進行重新分配以獲取正確的歷史記錄。但我沒有運氣創建這個回購只是幹線。我曾嘗試:

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk --authors ../authors.txt 

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk -no-minimize-url --authors ../authors.txt 

沒有任何成功。

回答

10

我自己也有同樣的問題。這是我如何解決它。

分別克隆兩個回購。

git svn clone -s [original-svn-location] [original-clone-directory] 
git svn clone -s [new-svn-location] [new-clone-directory] 

將舊的克隆數據添加到新的回購。

cd [new-clone-directory] 
git remote add oldstuff ../[original-clone-directory] 
git fetch oldstuff 

現在棘手的問題......請執行mastergit logoldstuff/master(或者trunkolstuff/trunk - 無論你將它設置)和新克隆和最後寫下的第一次提交的SHA從舊克隆中提交(在移動之前)。

git replace [first-commit-sha-from-new-clone] [last-commit-sha-from-old-clone] 

而且改寫SHA哈希所以一切都是猶太和你不再需要替換裁判...

git filter-branch 

現在清理無不再需要引用。

git remote rm oldstuff 
rm -rf .git/refs/replace 

你將失去​​首先從歷史提交,但由於這應該是最初的感動(即:沒有實際的文件內容發生了變化),它可能不會不管你的。

現在所有的歷史記錄都應該保留,並且git blame報告記得回購商的舊歷史記錄,爲您提供準確的信息。

您應該可以根據需要經常重複此操作(具體取決於您的項目更改其根位置的次數和/或移動兩側提交了多少分支)。

PS - 這種解決方案我適應我的需求從我發現here(我無法得到他的移植方法爲我的倉庫工作 - 但使用替換似乎工作得很好)。

+0

我再也不記得這個問題了,但我將其設置爲答案,因爲這似乎最接近我最終解決問題的方式。我相信我製作了一大堆單獨的分支,然後通過查看您描述的歷史將它們縫合在一起。 –

2

您可以使用SubGit轉換您的SVN信息庫。

不幸的是,版本1.0不支持您所擁有的複雜佈局。但有1.1 EAP version處理它。 1.0版本和1.1版本都可以在本地SVN倉庫中使用,因此您必須擁有對SVN倉庫的管理訪問權限。

請執行下列操作以SVN倉庫轉換爲Git的:

  1. 生成初始配置。

    $ subgit configure SVN_REPO 
    
  2. 最有可能的是,SubGit會檢測到這個倉庫中的兩個項目。 AFAIU,你只需要一個Git倉庫。所以,你必須在配置文件中保留一個'git'部分。指定您需要在那裏轉換的所有分支。

    $ EDITOR SVN_REPO/conf/subgit.conf 
    [core] 
        ... 
    [git "default"] 
        repository = .git 
        ... 
        trunk = trunk:refs/heads/master 
        branches = branches/*:refs/heads/* 
        tags = tags/*:refs/tags/* 
        shelves = shelves/*:refs/shelves/* 
        branches = iPhone/trunk:refs/heads/iPhone/master 
        branches = iPhone/branches/*:refs/heads/iPhone/* 
        tags = iPhone/tags/*:refs/tags/iPhone/* 
        branches = Android/trunk:refs/heads/Android/master 
        branches = Android/branches/*:refs/heads/Android/* 
        tags = Android/tags/*:refs/tags/Android/* 
        ... 
    [daemon] 
        ... 
    
  3. 將SVN轉換爲Git。

    $ subgit install SVN_REPO 
    
  4. 此時SubGit會將所有版本從SVN轉換爲Git。你可以在SVN_REPO/.git找到轉換的Git倉庫。另外SubGit保持SVN和Git倉庫同步,​​它會安裝特殊的鉤子來實現這一點。如果需要擺脫這些鉤子。

    $ subgit uninstall --purge SVN_REPO 
    

這就是全部。現在您已經將Git存儲庫與整個歷史記錄保持一致。

請注意,SubGit是一個商業產品,但這種一次性轉換是免費的。希望,它適合你。

+0

這看起來像是一個很好的解決方案,但由於很長一段時間,我這樣做了,我無法驗證解決方案並將其設置爲答案。但如果其他人可以驗證這是有效的,我很高興做出這個正確的答案。 –

相關問題