[英]How to convert svn:externals to git tags
我正在轉換相當不錯的SVN存儲庫。 這是約50個項目,包含約5種不同的可交付產品(一些項目在所有產品中共享,其他項目僅與幾個產品共享,許多項目是特定產品所獨有的)。 此處大約有15年的代碼歷史(〜16K svn修訂版)。
轉換為SVN的早期,我們使用SVN:externals標記了一些版本。 我們的代碼結構(簽出后在磁盤上)如下:
product1_root
-> shared_project
-> project_1
-> project_2
-> project_3
product2_root
-> shared_project
-> project_4
-> project_5
SVN中的結構如下(b / t / tr)=標准分支/標簽/主體子目錄:
product1_root (b/t/tr)
shared_project (b/t/tr)
project_1 (b/t/tr)
project_2 (b/t/tr)
project_3 (b/t/tr)
product2_root (b/t/tr)
project_4 (b/t/tr)
project_5 (b/t/tr)
使用外部組件時,在product1_root和product2_root項目上設置了外部組件以分別鏈接到shared / project2 / 3和shared / project4 / 5,以便它們在磁盤上創建上述結構。 結果,在發布時,只有product1 / 2_root項目會收到標簽(SVN外部組件會自動提取相應版本的子項目)。
我們后來擺脫了外部因素,轉而明確標記所有項目並使用腳本將其全部拉出進行構建。
有沒有一種方法可以在遷移期間將product1_root中的標簽傳播到project_1,project_2,project_3和shared_project中,以便它們與新git repo中的其余歷史記錄匹配。
還是我應該考慮將其作為遷移之前或之后的任務來解決?
我看過很多不同的工具,它們似乎都完全忽略了svn:externals,或嘗試將它們轉換為子模塊。
我終於想通了。 請記住,我的svn:externals設置為指向倉庫中的特定釘子(不是頭部),因此如果您不在同一條船上,則可能無法正常工作。
另外,從SVN到git的遷移必須按照時間順序進行,因為必須按順序處理SVN中的修訂歷史記錄。 以下兩個命令將執行此操作(源) :
git svn init [SVN repo url] --stdlayout --prefix=svn/
git svn fetch
假設您具有標准的SVN存儲庫布局(分支/標簽/主體)。 如果您的不同,則需要修改以上命令。 上面的命令還為所有內容加上svn /前綴,僅表示這些內容是從svn導入的,而不是從git本地創建的內容導入的(以備將來參考)。
一旦完成(將一個項目從我的16K修訂版SVN存儲庫中拉出大約需要90分鍾)。 然后,您可以使用以下命令在SVN存儲庫中查找svn:externals標簽創建的日期,並找到與您的項目相關的適當git commit:
git log --before='CCYY-MM-DD' -1
輸出將采用以下格式:
commit a22182ca563928b4de2143ff98dd0362f9eca36d
Author: <author>
Date: Wed Oct 31 21:58:01 2012 +0000
<Commit comment>
最后,獲取提交哈希的前幾個字符,並在git中創建標簽:
git tag -a v6.1.1.3 a22182 -m "manually creating git tag for svn:externals based tag"
驗證git repo和SVN repo中的標簽相同,然后繼續進行其余的轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.