簡體   English   中英

如何將svn:externals轉換為git標簽

[英]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.

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