我正在尝试建立一个branchA
具有子文件夹A
和的分支B
,但B
包含branchB
.
我一直在看submodules
、subtrees
和subrepos
,但我无法弄清楚我正在寻找什么。
为了防止这成为 XY 问题,我的总体情况是:我正在开发一个 HTML5/JS 游戏,我希望能够在 Github Pages 上对其进行测试。
所以我希望分支/子目录gh-pages/play
包含分支master
。
我正在尝试建立一个branchA
具有子文件夹A
和的分支B
,但B
包含branchB
.
我一直在看submodules
、subtrees
和subrepos
,但我无法弄清楚我正在寻找什么。
为了防止这成为 XY 问题,我的总体情况是:我正在开发一个 HTML5/JS 游戏,我希望能够在 Github Pages 上对其进行测试。
所以我希望分支/子目录gh-pages/play
包含分支master
。
分支没有文件夹/目录。很简单,分支是指向提交哈希 ID 的指针(它们开始时是包含原始哈希 ID 的小文件,尽管它们可以被压缩成一种名称到 ID 映射的数据库,Git 这样做是为了节省时间和空间对于不经常更改的名称)。所以直接是不可能的。
不过,可以用子模块做你想做的事。这很棘手。你必须非常小心。我也完全不清楚它是否可以与这个 GitHub Pages 的东西一起工作,因为他们必须做一个克隆和结帐的子模块操作。
Git子模块实际上只是另一个 Git 存储库:您告诉 Git 某个目录(“文件夹”),例如B
应该通过从某个特定 URL克隆不同的 Git 存储库来创建。克隆完成后,Git 应该通过哈希 IDcd
进入创建的目录git clone
和git checkout
一个特定的提交。
好吧,如果对于“不同”的 Git 存储库,您想git://host.name/path/to/url.git
签出到子目录B
,您指定 URLgit://host.name/path/to/url.git
怎么办?
这里明显的危险是无限递归的可能性:Git 签出url.git
,看到它有一个子模块,克隆url.git
到子目录B
,签出里面的提交B
,看到它有一个子模块,克隆它,cd
s 到现在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
”。
(显然,这整个事情有点容易出错,就像一般的子模块一样。我怀疑这不是一个非常明智的路径。但至少在理论上,它可以工作。)