0

我正在尝试建立一个branchA具有子文件夹A和的分支B,但B包含branchB.

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

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

4

1 回答 1

1

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

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

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

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

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

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

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

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

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

例如,假设您develop在这个超级项目中的分支上,其中包含自作为子模块。在develop中,有一个.gitmodules文件说“我有一个子模块/子项目,你应该克隆到B,使用这里的 URL”(这是超级项目的 URL)。在 develop 的提示提交中,您有一个包含“gitlink”树条目的提交,上面写着“克隆到B中,在 中查找子项目的 URL .gitmodules,并使用哈希deadb0a”——这是branch的提示提交master的哈希。

一旦你将提示推进master到一个的提交ac0ffee,你检查develop并做出一个的提交,它有一个“gitlink”树条目,上面写着“B使用哈希进行克隆ac0ffee”。没有其他任何变化——只是哈希 ID——但是现在,当有人在启用子模块的情况下签出develop B,他们会得到与通过签出分支 master输入相同的提交B,因为分支master说“签出哈希ac0ffee”。

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

于 2017-04-08T17:28:03.433 回答