gpt4 book ai didi

git - 使用在 mercurial 存储库中有另一个 git subrepo 的 git subrepo,这可能吗?

转载 作者:太空狗 更新时间:2023-10-29 13:22:45 25 4
gpt4 key购买 nike

我有一个 mercurial 存储库,并且毫无问题地添加了一个 git 子存储库( hg 1.8 )。

问题是:这个 git subrepo 内部有另一个 git subrepository 并且它没有被 pull 出(它在 git 的 subrepo .gitmodules 文件中),除非我做一个 git clone --recursive在我的 git subrepo 上:这样做是可行的。

问题:我做了一个hg pull在另一台机器的我的存储库中,它提取了 git subrepo ,但它不会 pull .gitmodules . .gitmodules 仅在我执行 git clone --recursive 时才被 pull 入另一台机器中.

有没有人有任何建议来处理这种情况?丑陋的解决方案是做一个 git clone并将所有文件(包括 git 元数据)添加到我的 mercurial 存储库中,而不像子存储库。

最佳答案

我想最好的解决方法是修补 Mercurial 的 Git 子存储库支持以始终使用 Git 的递归选项(例如,克隆基于 Git 的子存储库时 git clone --recursive, pull 更新的基于 Git 的子存储库后的 git pull --recurse-submodules && git submodule update 等)。我知道 Git 开发人员特别选择不自动初始化子模块,因为他们想要支持的工作流程之一是“我永远不想看到任何子模块”,但也许“始终初始化所有子存储库”更适合默认的 Mercurial 操作模式(我不是 Mercurial 用户,所以我不太清楚默认的 Mercurial 样式是什么)。

在此之前,您或许可以通过翻译 subrepo/.gitmodules 来解决该问题。条目 .hgsub条目。手动操作很容易,但如果它很重要,您可以将其自动化(使用 git config.git/config 和/或 .gitmodules 中提取路径和 URL)。如果您正在处理 .gitmodules,这可能没有吸引力。变化很大的文件(每次 .hgsub 更改时,您都必须非常努力地同步 .gitmodules)。

我用四个存储库对此进行了测试:

  • gitsub — “叶子”存储库(无 Git 子模块)
  • gitsuper — Git“ super 项目”;gitsub/是 gitsub 作为子模块
  • hgsuper2 — Mercurial“ super 项目”;gitsuper/是 gitsuper 作为子存储库,gitsuper/gitsub是 gitsub 作为子存储库。
  • hgsuper2-clone — 一个克隆的 Mercurial “ super 项目”;gitsuper/是 gitsuper 作为子存储库,gitsuper/gitsub是 gitsub 作为子存储库。

  • 我像这样构建和测试它们:
  • 创建gitsub。添加并提交一些内容。
  • 创建 gitsuper。
  • 添加一些内容。
  • git submodule add url-of-gitsub gitsub && git submodule init
  • git commit -m 'added gitsub'
  • 创建 hgsuper2。
  • 添加一些内容。
  • git clone --recursive url-of-gitsuper gitsuper
  • echo 'gitsuper = [git]url-of-gitsuper' >> .hgsub
  • echo 'gitsuper/gitsub = [git]url-of-gitsub' >> .hgsub最后两个步骤可以从 gitsuper/.git/config 的比特中自动化。和 gitsuper/.gitmodules .
  • hg add .hgsub && hg commit -m 'added Git subrepositories'
  • 从 hgsuper2 克隆 hgsuper2-clone。
    它在 gitsuper/ 中获取适当的内容和 gitsuper/gitsub/ .
  • 更新并提交新内容到 gitsub。
  • 更新 gitsuper。
  • 添加或更改一些内容并暂存。
  • (cd gitsub && git pull origin master)
  • git add gitsub && git commit -m 'updated gitsuper content (also gitsub)'
  • 在 hgsuper2 中,从 Git 存储库中提取更改。
  • (cd gitsuper && git pull --recurse-submodules && git submodule update)gitsuper/中的内容和 gitsuper/gitsub/由 pull 更新。
  • hg commit -m 'updated gitsuper (and its contents)'
  • pull 入 hgsuper2-clone。
  • hg pull -u来自 Git 的内容已更新。

  • 我的测试有效(使用 Mercurial 1.8.1 和 Git 1.7.4.1),但我注意到一个错误。 Mercurial 创建并 check out 一个奇怪命名的 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 存储库(基于 Git 的 Mercurial 子存​​储库)并使用 git checkout HEAD~0 && git branch -D origin/master 删除分支来解决这个问题。 (第一个分离 HEAD 并且(更重要的是)移出分支,以便它可以被下一个命令删除)。只要您在 Git 存储库中没有任何本地更改更改,此解决方法是完全安全的。

    另一个小问题是您需要运行 git submodule init在由 Mercurial 创建的 Git super 存储库中发出 Git 子模块命令之前让 Git 了解其子模块(子模块被克隆到正确的位置,但它们是由 Mercurial 建立的,因此在 .git/config 中没有它们的条目) )。

    类似地,如果您计划从基于 Git 的 Mercurial 子存​​储库中创作对 Git 管理的内容的更改,那么在在 Mercurial 中提交之前,您应该小心始终从 Git 子存储库添加任何 Git 子模块、提交和推送“ super 工程”。否则,您最终可能会遇到这样的情况:Mercurial 使用 gitsuper 和 gitsub 的一种组合,而 gitsuper 本身指的是不同版本的 gitsub。换句话说,由于您将绕过 Git 的子模块代码(通过将 Git 子模块作为 Mercurial 子存​​储库进行管理),您需要小心保持 Git 对子模块的 View 与 Mercurial 的 View 同步。

    关于git - 使用在 mercurial 存储库中有另一个 git subrepo 的 git subrepo,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5420664/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com