【问题标题】:Include other branch as subdirectory?包括其他分支作为子目录?
【发布时间】:2017-09-03 13:48:49
【问题描述】:

我正在尝试建立一个分支,使branchA 具有子文件夹AB,但B 包含branchB 的内容。

我一直在查看 submodulessubtreessubrepos,但我无法弄清楚我在寻找什么。

为了防止这成为 XY 问题,我的总体情况是:我正在开发一个 HTML5/JS 游戏,我希望能够在 Github Pages 上对其进行测试。
所以我希望分支/子目录gh-pages/play 包含分支master

【问题讨论】:

    标签: git git-submodules git-subtree git-subrepo


    【解决方案1】:

    分支机构没有文件夹/目录。分支,很简单,指向提交哈希 ID 的指针(它们开始时是包含原始哈希 ID 的小文件,尽管它们可以被压缩到一种名称到 ID 映射的数据库中, Git 确实可以为不经常更改的名称节省时间和空间)。所以不能直接使用。

    可以用子模块做你想做的事。这很棘手。你必须非常小心。我也完全不清楚它是否能与这个 GitHub Pages 的东西一起工作,因为 他们 必须进行克隆和签出与子模块操作。

    Git 子模块 实际上只是另一个 Git 存储库:您告诉 Git 一些目录(“文件夹”)例如 B 应该通过克隆一个 不同 Git 存储库,来自某个特定的 URL。克隆完成后,Git 应该 cd 进入 git clone 生成的目录,git checkout 通过哈希 ID 进行一个特定的提交。

    好吧,如果您希望 git://host.name/path/to/url.git 签出到子目录 B 的“不同”Git 存储库,您指定 URL git://host.name/path/to/url.git 怎么办?

    这里明显的危险是无限递归的可能性:Git 检查url.git,发现它有一个子模块,将url.git 克隆到子目录B,检查B 中的提交,看到它有一个子模块,克隆它,cds 到现在的B/B,看到它有一个子模块,克隆它,进入B/B/B,看到它有一个子模块...

    您可以通过以下方式避免这种无休止的递归:

    • 不进行递归子模块提取的克隆(这是git clone 的默认设置),和/或
    • 确保永远不要让子模块的特定提交包含将子模块作为子模块的提交。

    还有一个问题:子模块通过hash ID检查一个特定的提交,而不是通过分支名称。你想让B 成为一个自我克隆,它检查分支master(大概永远不会有一个自我子模块B)。但是你能得到的是一个B,它检查一个特定的Git哈希ID,这是你存储在超级项目的提交中的哈希ID(当然是同一个存储库)。

    有一些方法可以将子模块从其一个特定的提交中移除,包括通过分支名称检查分支的方法。这些需要运行特定的 git submodule 命令,这可能会阻止您在 GitHub Pages 上执行此操作(无论是什么,再次)。但是,假设他们完全让你做子模块的事情,你不一定要让它通过 name:你可以做一个新的提交,将新的 master 哈希存储到超级项目。

    比如说,你在这个超级项目-with-self-as-submodule 的分支develop 上。在develop 中,有一个.gitmodules 文件显示“我有一个子模块/子项目,你应该克隆到B,使用这里的URL”(这是超级项目的URL)。在develop的提示提交中,您有一个包含“gitlink”树条目的提交,上面写着“克隆到B,在.gitmodules中查找子项目的URL,并使用哈希@987654348 @"——这是分支master提示提交的哈希。

    一旦您将 master 的提示推进到 new 提交 ac0ffee,您检查 develop 并进行 new 提交,其中包含“gitlink ” 树条目,上面写着“使用哈希 ac0ffee 克隆到 B”。没有其他任何变化——只是哈希 ID——但是现在,当有人签出 develop 启用子模块时,他们在B 中获得与签出 branch master in B,因为分支 master 说“检查哈希 ac0ffee”。

    (显然整个事情有点容易出错,就像一般的子模块一样。我怀疑这不是一个非常明智的方法。但至少在理论上,它可以工作。)

    【讨论】:

    • 有趣的事实:子模块现在可以跟踪分支。
    • @DuncanXSimpson:因此 有一些方法可以将子模块从其一个特定的提交中移除,包括通过分支名称检查分支的方法。这些需要运行特定的 git 子模块命令 ... 您必须设置分支的名称(我认为您可以将其保存在提交的 .gitmodules 文件中)然后运行 ​​git submodule update --remotegit submodule checkout --remote
    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 2012-02-08
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多