将其他分支包含在子目录中?

时间:2017-04-08 05:38:46

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

我试图设置一个分支,branchA包含子文件夹AB,但B包含branchB的内容。

我一直在关注submodulessubtreessubrepos,但我无法弄清楚我会在做什么。

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

1 个答案:

答案 0 :(得分:1)

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

可以用子模块做你想做的事情。这很棘手。你必须非常小心。对于我来说,无论GitHub页面的内容是什么都可以,它一点也不清楚,因为他们必须进行克隆和签出子模块操作。

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

那么,如果您希望git://host.name/path/to/url.git检查到子目录B中的“不同”Git存储库,请指定网址git://host.name/path/to/url.git

这里显而易见的危险是无限递归的可能性:Git检出url.git,看到它有一个子模块,克隆url.git到子目录B,检查出内部的提交{ {1}},看到它有一个子模块,克隆它,B到现在的cd,看到它有一个子模块,克隆它,进入B/B,看到它有一个子模块...

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

  • 无需递归子模块提取的克隆(这是B/B/B的默认设置),和/或
  • 非常确定永远不会对子模块进行特定的提交,包括将子模块作为子模块的提交。

还有一个问题:子模块通过哈希ID 检出一个特定的提交,而不是通过分支名称。您希望git clone成为自我克隆,检查分支B(可能永远不会有自我子模块master)。但是你只能获取B,它会检出一个特定的Git哈希ID,这是你在超级项目中提交时存储的哈希ID(当然这是同一个存储库) )。

有一些方法可以将子模块从其特定提交中删除,包括通过branch-name检查分支的方法。这些需要运行特定的B命令,这可能会阻止您在GitHub页面上执行此操作(无论是什么,再次)。但是,假设它们让你完成子模块的事情,你不一定要通过 name 来实现它:你可以创建一个存储新git submodule哈希的新提交进入超级项目。

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

master的提示推进到提交master后,您可以查看ac0ffee并制作具有“gitlink”树条目的提交,该条目说“使用散列develop将副本复制到B”。没有其他任何改变 - 只是哈希ID - 但是现在,当某人在启用子模块的情况下检出ac0ffee 时,他们会在develop中获得相同的提交,他们会通过签出< B中的em>分支 master,因为分支B表示“签出哈希master”。

(显然这整个事情有点容易出错,一般都是子模块。我怀疑这不是一条非常明智的道路。但从理论上讲,它至少可以起作用。)