簡體   English   中英

如何將一組mercurial存儲庫轉換為git存儲庫?

[英]How do I convert a set of mercurial repositories into a git repository?

我有的

我目前有一組包含源代碼的mercurial存儲庫。 他們使用分支的“分叉存儲庫”方案。 因此,功能“分支”可能如下所示:

master repo           A→B→C
                    ———————↘—————
cool_feature repo           D→E→F

一旦cool_feature准備好黃金時間,我們hg pullhg pull入主機,這樣它將如下所示:

master A→B→C→D→E→F

那時, cool_feature將擁有與master相同的東西,它可以被丟棄。

盡管D→E→F在某些時間點位於單獨的存儲庫中,但它們始終位於mercurial中的“默認”分支上。 我們不使用命名分支來管理這些數據。

這在mercurial中效果很好,但是我們計划轉向git並且git做的事情有點不同。 當然,你仍然可以在git中使用fork repos,但是git branch是短暫的,因此可用於短期分支。

我想要的是

我想將其轉換為單個git存儲庫,該存儲庫使用分支來管理仍在庫存中的工作。 在流程方面,我們將基本上使用“git flow”。 拉取請求將在分支之間,一旦工作完成,分支將被刪除。

master branch           A→B→C
                     ————————↘—————
cool_feature branch           D→E→F

我試過的

我不能簡單地使用hg的convert ,因為它不了解多個存儲庫。 實際上,整個hg-git生態系統中的每個工具似乎都希望將git分支轉換為hg分支,反之亦然。 (盡管有證據表明各社區在實踐中使用它們的方式非常不同。)

一個想法是將它們拉入單個存儲庫,轉換它,然后讓git對其進行排序。 畢竟,git只需要標記頭部。 這個想法的問題是大多數工具拒絕轉換多頭存儲庫,如果他們這樣做,git會悄悄地丟棄未經標記的頭部。 如果可以事后標記它們,我還沒弄明白。

另一個想法是,在mercurial中,將這些變更集移動到命名分支,並讓存儲庫轉換器完成工作。 這很棘手,因為分支並不總是從一個點開始:

master repo            A→B→C→F→G→H
                     ———————↘—————↘————————
nifty_feature repo           D→E   I→J
                                \    ↓
                                 +——→K→L→M (K is a merge of E and J)

當兩個開發人員一起開始一個項目的工作時,通常會出現這種情況,但最終不會出現與他們的起點完全相同的變更集。 但是沒有一點可以選擇作為創建分支的“上線”。

另一個可能的情況是第一次修訂是合並時:

master repo          A→B———→C
                        \    \
                         +→D  \
                    ————————\——↘—————————
gnarly_feature repo          +—→E→F

這里,分支的“根”是ECD之間的合並。 鑒於它是一個合並修訂版,我並不是很清楚你如何將它重新定義到一個新的分支。

由於其他原因,我已經通過reposurgeon運行轉換,所以我可以訪問一些相當奇特的工具來在飛行中修改它。 但是每次轉換需要大約20個小時,所以嘗試一堆沒有成功的東西已經證明是非常昂貴的。

但似乎因為人們確實從hg轉換為git並且這些都是常用的分支方案,所以有人在那里肯定解決了這個問題。 有關使用什么工具或嘗試什么策略的任何想法都是受歡迎的。 如何實現這一目標?

他們總是在mercurial的“默認”分支。 我們不使用命名分支來管理這些數據

這是一個很大的錯誤:您可以同時使用命名分支+單獨的克隆

我想將其轉換為單個git存儲庫,該存儲庫使用分支來管理仍在庫存中的工作

它可能是大誤差2(方向/從Hg到Git /和方法/單回購/)

整個hg-git生態系統中的每個工具似乎都希望將git分支轉換為hg分支,反之亦然。

錯了。 我手里拿着Git-repo,用一組Git-branches克隆了hg-git。 在Mercurial方面,我(如預期)有一個分支

>hg branches
default                     5266:1ffe854c93c1

和Git-branches,作為hg書簽呈現(他們真的是)

>hg book
   1.6                       2344:fc32e948fcba
   1.7                       5140:1c58e9bfa3d5
   2.0                       5219:683d072d02b6
   feature_dbpluginapi       4986:a855a635e17f
   feature_indexCleanup      5207:7ec7ee38ef2f
   feature_preview           4806:d40ade50b113
   feature_updateAll         4807:97ea12fea917
   master                    4620:de0053588acf

我不能簡單地使用hg的轉換,因為它不了解多個存儲庫

但是您必須將它用於每個存儲庫轉換:

  • 使用--branchmap選項將每個feature-repo轉換為中間Mercurial-repo(將default分支重命名為另一個... feature-name?)
  • 將轉換后的倉庫轉換為主倉庫; 您必須獲得完整的歷史記錄,與舊的相同,但有一個例外:所有功能開發都將出現在唯一的命名分支中
  • 使用hg-git或Git-Hg橋將聚合回購推送到Git

暫無
暫無

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

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