[英]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
最近在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
您將無法獲得b
或c
pre-copy-to-parent-proj歷史記錄。 git svn
將您提供的基本路徑解釋為您有興趣攝取SVN提交的最淺點,使Git提交相同的內容。 由於b
和c
下的歷史提交都在這條路徑之外, 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.