2011-03-24 53 views
5

我有一個mercurial倉庫,並沒有添加任何問題git subrepo(hg 1.8)。使用在mercurial存儲庫中有另一個git subrepo的git subrepo,這可能嗎?

問題是:這個混帳subrepo內部有它自己的其它混帳subrepository並沒有被拉(它在Git的subrepo .gitmodules文件),除非我在我的git subrepo做git clone --recursive:這樣做它的工作方式。

問題:我在另一臺機器的存儲庫中做了一個hg pull,它拉動了git subrepo,但它並沒有拉動.gitmodules。當我做了一個git clone --recursive時.gitmodules只在另一臺機器上被拉出。

有沒有人有任何建議來處理這種情況? 醜陋的解決方案是做一個git clone,並簡單地將所有文件(包括git元數據)添加到我的mercurial存儲庫,而不像subrepo。

回答

3

我想最好的解決將是修補水銀的Git的subrepository支持始終使用Git的遞歸選項(例如git clone --recursive拉動更新的Git和subrepository等之後克隆一個Git和subrepository,git pull --recurse-submodules && git submodule update時)。我知道Git開發人員特別選擇不自動初始化子模塊,因爲他們希望支持的工作流之一是「我從不想看到任何子模塊」,但也許「始終初始化所有子模塊」是更好的匹配默認Mercurial操作模式(我沒有太多的Mercurial用戶,所以我對默認的Mercurial風格會有什麼不瞭解)。


等到那個時候,你也許可以通過翻譯subrepo/.gitmodules項爲.hgsub項解決此問題。手動操作很容易,但如果重要的話,您可能會自動執行該操作(使用git config.git/config和/或.gitmodules中提取路徑和URL)。如果你正在處理的.gitmodules文件變化很大(每次更改.gitmodules時你都必須非常勤奮地同步.hgsub),這可能沒有吸引力。

我有四個存儲庫進行測試的: - 一個「葉」儲存庫(沒有GIT中的子模塊)

  • gitsuper -

    • gitsub一個GIT中「上層項目」;
      gitsub/gitsub作爲子模塊
    • hgsuper2 - 一個水銀「上層項目」;
      gitsuper/gitsuper作爲subrepository,
      gitsuper/gitsub是gitsub作爲subrepository。
    • hgsuper2-clone - 克隆的Mercurial「superproject」;
      gitsuper/gitsuper作爲subrepository,
      gitsuper/gitsub是gitsub作爲subrepository。

    我建造和測試他們是這樣的:

    1. 創建gitsub。添加並提交一些內容。
    2. 創建gitsuper
      1. 添加一些內容。
      2. git submodule add url-of-gitsub gitsub && git submodule init
      3. git commit -m 'added gitsub'
    3. 創建hgsuper2
      1. 添加一些內容。
      2. git clone --recursive url-of-gitsuper gitsuper
      3. echo 'gitsuper = [git]url-of-gitsuper' >> .hgsub
      4. echo 'gitsuper/gitsub = [git]url-of-gitsub' >> .hgsub
        最後兩個步驟可以從gitsuper/.git/configgitsuper/.gitmodules位被自動化。
      5. hg add .hgsub && hg commit -m 'added Git subrepositories'
    4. 克隆hgsuper2克隆hgsuper2
      它得到gitsuper/gitsuper/gitsub/中的適當內容。
    5. 更新並提交新內容至gitsub
    6. 更新gitsuper
      1. 添加或更改內容並將其放置。
      2. (cd gitsub && git pull origin master)
      3. git add gitsub && git commit -m 'updated gitsuper content (also gitsub)'
    7. hgsuper2,拉從Git的suprepositories變化。
      1. (cd gitsuper && git pull --recurse-submodules && git submodule update)
        內容在gitsuper/gitsuper/gitsub/由拉更新。
      2. hg commit -m 'updated gitsuper (and its contents)'
    8. 拉進hgsuper2克隆
      1. hg pull -u
        Git的內容已更新。

    我的測試工作(使用水銀1.8.1和Git 1.7.4.1),但我注意到一個錯誤。 Mercurial創建並檢出一個奇怪的Git分支(origin/master(即refs/heads/origin/master),而不是使用分離的HEAD(像Git對子模塊做的那樣)或僅使用master(即refs/heads/master))。它也似乎變得有點有時楔入,導致這樣的錯誤:

    fatal: git checkout: branch origin/master already exists 
    abort: git checkout error 128 in gitsuper 
    

    我工作圍繞這一問題通過進入有問題(基於Git的,水銀subrepository)的Git倉庫,並刪除分支git checkout HEAD~0 && git branch -D origin/master(第一個分離HEAD和(更重要的是)離開分支,所以它可以被下一個命令刪除)。只要您在Git存儲庫中沒有任何本地更改,此解決方法就完全安全。

    另一個小問題是,你將需要運行git submodule init讓Git的知道它的子模塊,是由水銀創建(子模塊克隆到正確的地方一個Git超級倉庫發出的Git子模塊命令之前,但他們由Mercurial建立,因此.git/config中沒有他們的條目)。同樣,如果您計劃從基於Git的Mercurial子庫中創建對由Git管理的內容的更改,那麼您應該小心始終在Git子庫之前添加任何Git子模塊,提交和推送承諾參與Mercurial「超級項目」。否則,可能會在那裏水銀使用gitsupergitsub的一個組合gitsuper本身指的是不同版本gitsub的結束與一個局面。換句話說,由於您將繞過Git的子模塊代碼(通過將Git子模塊作爲Mercurial子庫進行管理),您需要小心將Git的子模塊視圖與Mercurial的子模塊保持同步。

  • +0

    令人驚歎的答案。賞金是你的。感謝所有的努力。我要測試解決方法,並且可能會在mercurial的代碼和郵件列表中進行一些關於修補此行爲的搜索。 – 2011-04-03 19:19:46

    +0

    當時你的回答確實很棒,但我只是放棄了所有這些瘋狂。 :) – 2015-05-14 04:57:51

    0

    Git並不真的「喜歡」子項目。我做了一些四處看看,似乎http://git.rsbx.net/Notes/Git_Subprojects.txt可能包含您正在尋找的信息?

    +0

    該文件是很老。它很可能是在Git在Git 1.5.3(2007年9月)中獲得子模塊支持之前編寫的。在Git 1.5.4(2008年2月)中棄用了它使用的「虛假命令」('git-clone'而不是'git clone'),並從Git 1.6(2008年8月)中的正常PATH中取出。 我不知道該文件應該如何幫助提問者。是否應該提供一些關於如何手動管理子項目的想法? 在我看來,這主要是一個Mercurial問題(如何讓它自動在基於Git的子庫中使用'.gitmodules'文件)。 – 2011-04-03 06:15:45

    +0

    @Chris Johnsen:正確。 Mercurial可以將git repos作爲子庫,但是當這些git倉庫充當hg子倉庫時,它們自己擁有一個git subrepo(在.gitmodules文件中).gitmodules中的這個倉庫不會被克隆。我必須手動克隆git subrepo。 – 2011-04-03 06:18:54

    1

    適合未來的潛伏者。你可能會真正使用Hg-Git plugin爲水銀獲得git的子模塊的自動檢索:

    1. 通過apt /豆子/ PIP /安裝擴展...並激活它在你的~/.hgrc
    2. 導航到你的項目目錄,或只是通過hg init test && cd test
    3. 克隆您的git依賴一些虛擬存儲庫(其中也有它自己的子模塊)和指甲它到你想要的承諾:hg clone https://github.com/user/libawesome.git && (cd libawesome && hg up release)
    4. 將它保存在.hgsub任何其他汞subrepository與合作MMIT變化:echo "libawesome = https://github.com/user/libawesome.git" >> .hgsub && hg add .hgsub && hg ci -m "git subrepository added;"
    5. 現在,您可以驗證git的依賴是傳遞性克隆:(cd .. && hg clone test test2)
    相關問題