簡體   English   中英

轉換為git時保留svn副本歷史記錄

[英]Retaining svn copy history when converting to git

我正在嘗試將SVN repo轉換為多個git repos。 到目前為止,我一直在為SVN中的每個項目使用git svn clone svn_repo_project_path 我注意到git似乎沒有遵循svn復制操作,因此生成的歷史比我預期的要簡單得多。 假設我的SVN repo看起來像這樣:

  • 一個
  • b
  • C
  • 家長PROJ
    • b
    • C

項目bc最近在parent-proj下被復制,作為重組工作的一部分,目的是最終將它們從根目錄下的舊位置刪除。 當我執行git svn clone http://svnhost/parent-proj ,生成的git repo缺少移動前來自/b/c所有歷史記錄。

這是git-svn的限制還是有一些方法可以讓這個歷史出現在我的回購中? 從我有限的研究看來,使用filter-branch命令,如獲取已使用git-svn重命名的SVN repo的完整歷史記錄中描述的可能有效,盡管在我的情況下有多個父項可能使事情復雜化。 可以首先克隆整個倉庫,然后從中拆分新的倉庫(使用filter-branch?)是一種更好的方法嗎?

如果您使用git svn clone http://svnhost/parent-proj您將無法獲得bc pre-copy-to-parent-proj歷史記錄。 git svn將您提供的基本路徑解釋為您有興趣攝取SVN提交的最淺點,使Git提交相同的內容。 由於bc下的歷史提交都在這條路徑之外, git svn不會反映它們,所以你不會有那個歷史。

看一下git svn init --no-minimize-url選項的文檔:

當跟蹤多個目錄(使用--stdlayout, - blank或--tags選項)時,git 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 log -C --follow <file-path> ,Git通常會很好地定位並為您提供包含重命名和副本的歷史記錄。 不要指望目錄相同,例如parent-proj/b Git跟蹤blob(文件),樹(blob),提交和父提交,但不以與SVN相同的方式處理目錄或目錄副本。

暫無
暫無

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

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