2017-04-08 71 views
0

我试图建立一个分支,使得branchA具有子文件夹AB,但B包含branchB的内容。包含其他分支作为子目录?

我一直在寻找submodulessubtreessubrepos,但我想不出什么会做什么,我期待的。

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

回答

1

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

可能做你想要的子模块,但。这只是棘手。你必须非常小心。我也完全不清楚它是否可以用于任何GitHub Pages的事情,因为他们不得不做一个克隆和检查与子模块操作。

一次Git 子模块真的只是一个Git仓库:你告诉Git的一些目录(“文件夹”),如B应该通过克隆不同 Git仓库,从某些特定网址进行。一旦克隆完成后,Git应该将cd放入git clone生成的目录中,然后git checkout通过哈希ID进行一次特定的提交。

那么,如果要为“不同的”Git存储库想要git://host.name/path/to/url.git检入子目录B,请指定URL git://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(这可能从来没有自我submodule B)。但所有你可以得到是一个B签出一个特定的Git哈希ID,这是你存储在超级项目(这当然是同一个存储库)提交中的哈希ID。

有一些方法可以将子模块从其特定的提交中解脱出来,包括通过分支名称检出分支的方法。这些需要运行特定的git submodule命令,这是可能阻止您在GitHub页面上执行此操作的一部分(不管是什么)。但是,假设他们让你完成子模块的工作,则不一定非得通过名称:你可以做一个新的提交,将新的master散列存储到超级项目中。

举个例子,假设你在这个超子项目中使用分支develop作为子模块。在develop中,有一个.gitmodules文件,上面写着“我有一个应该克隆到B中的子模块/子项目,使用此URL”(这是超级项目的URL)。在尖提交发展的那么这次提交包含“gitlink”树条目,上面写着“让克隆到B,在.gitmodules仰视子项目的网址,并使用哈希deadb0a” - 这是尖端的哈希分支master的承诺

一旦你前进的master尖端到提交ac0ffee,你看看develop并作出提交具有“gitlink”树条目,上面写着“让克隆到使用散列ac0ffeeB” 。没有别的变化,只是哈希ID,但是现在,当有人取出develop启用子模块,他们得到B同犯,他们将通过检查分支masterB,因为分支master说:“退房哈希ac0ffee“。

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

+0

有趣的事实:子模块现在可以跟踪分支。 –

+0

@DuncanXSimpson:因此*有一些方法可以将子模块从其特定的提交中移除,其中包括通过分支名称检查分支的方法。这些需要运行特定的git子模块命令... *您必须设置分支的名称(我认为您可以保存在提交的'.gitmodules'文件中),然后运行'git submodule update --remote'或'git子模块结帐--remote'。 – torek

相关问题