2012-05-18 60 views
6

我試圖將SVN回購轉換爲多個git回購。到目前爲止,我一直在爲SVN中的每個項目使用git svn clone svn_repo_project_path。我注意到git似乎不遵循svn複製操作,所以結果歷史比我想象的要簡單得多。假設我的SVN回購是這樣的:轉換爲git時保留svn複製歷史

  • 一個
  • b
  • Ç
  • 家長凸出
    • b
    • Ç

項目bcparent-proj下最近被複制的重組計劃與最終從自己的老位置刪除它們下根的意圖的一部分。當我做git svn clone http://svnhost/parent-proj時,由此產生的git repo在移動之前缺少源自/b/c的所有歷史記錄。

這是git-svn的限制還是有一些方法可以讓這個歷史記錄顯示在我的回購中?從我的有限研究看來,使用Getting complete history of an SVN repo that's been renamed using git-svn中描述的filter-branch命令似乎可行,但在我的情況下,有多個父母可能會使事情複雜化。可以先克隆整個回購,然後從中分出新回購(使用過濾分支?)是一種更好的方法嗎?

+0

即使在移動目錄時,我也會記錄所有文件的歷史記錄。而我的'git svn clone'也跟蹤被克隆目錄之外的項目(它們來源於哪裏)。 –

+2

@ShadowCreeper:你使用的是什麼版本的Git?我遇到了和Patrick一樣的問題 – Pylinux

+0

我不確定他們被克隆了哪個版本。我相信它最初是一個1.7版本(這是幾個月前的debian wheezy的最新版本)。然而,我最近使用v1.8.4記錄了其中一個具有混亂歷史的項目,並且它的行爲相同(有些SHA具有完全不同的樹)。也許SVN服務器版本更重要?我相信這仍然是1.7。 –

回答

0

如果您git svn clone http://svnhost/parent-proj,您將不會獲得bc的預複製到父項目歷史記錄。 git svn將你提供的基本路徑解釋爲你感興趣攝取SVN提交的最淺點,使得Git承諾相同。由於bc之下的歷史提交超出了此路徑,因此git svn將不會對它們進行鏡像,因此您將不會擁有該歷史記錄。

看看文檔爲git svn init --no-minimize-url選項:

當跟蹤多個目錄(使用--stdlayout,--branches,或--tags選項),混帳SVN會嘗試連接到根(或最高允許級別)的Subversion版本庫。如果整個項目在存儲庫中移動,此默認值允許更好地跟蹤歷史記錄,但可能會導致存在讀取訪問限制的存儲庫中出現問題。傳遞--no-minimize-url將允許git svn按原樣接受URL,而不嘗試連接到更高級別的目錄。當只有一個URL /分支被跟蹤時,這個選項默認是關閉的(它不會有什麼好處)。

由於您clone命令不指定多個分支(也許是因爲你有一個複雜的,多項目或非標準配置),git svn只克隆提交了涉及這條道路和向下。 Shadow Creeper在評論中使用了-s--stdlayout選項,這可以解釋爲什麼會保留一些歷史記錄。

如果這是一次性轉換(從SVN單向轉移到Git),那麼您應該克隆整個存儲庫,然後在Git中移動東西以尋找您想要的方式包括建立歷史分支和標籤。如果運行filter-branch的動機是保存存儲庫空間,請確保這實際上會爲您節省一些東西,並且值得費心。 Git對存儲非常有效。

在Git克隆中期待歷史搜索的最後一句話。使用git log -C --follow <file-path>在文件中查找歷史記錄,Git通常會很好地查找並提供包含重命名和副本的歷史記錄。不要指望相同的目錄,例如parent-proj/b。 Git跟蹤blob(文件),樹(blob),提交和父提交,但不像SVN那樣處理目錄或目錄拷貝。

相關問題