分支机构没有文件夹/目录。分支是,很简单,指向提交哈希 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”。
(显然整个事情有点容易出错,就像一般的子模块一样。我怀疑这不是一个非常明智的方法。但至少在理论上,它可以工作。)