我试图建立一个分支,使得branchA
具有子文件夹A
和B
,但B
包含branchB
的内容。包含其他分支作为子目录?
我一直在寻找submodules
,subtrees
和subrepos
,但我想不出什么会做什么,我期待的。
为了防止这成为一个XY问题,我的总体情况是这样的:我正在开发一个HTML5/JS游戏,我希望能够在Github页面上测试它。
所以我想要分支/子目录gh-pages/play
包含分支master
。
我试图建立一个分支,使得branchA
具有子文件夹A
和B
,但B
包含branchB
的内容。包含其他分支作为子目录?
我一直在寻找submodules
,subtrees
和subrepos
,但我想不出什么会做什么,我期待的。
为了防止这成为一个XY问题,我的总体情况是这样的:我正在开发一个HTML5/JS游戏,我希望能够在Github页面上测试它。
所以我想要分支/子目录gh-pages/play
包含分支master
。
分支没有文件夹/目录。分支是,很简单,指向提交哈希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”树条目,上面写着“让克隆到使用散列ac0ffee
B
” 。没有别的变化,只是哈希ID,但是现在,当有人取出develop
启用子模块,他们得到B
同犯,他们将通过检查分支master
在B
,因为分支master
说:“退房哈希ac0ffee
“。
(显然,这整个事情是有点容易出错,因为在一般的子模块。我怀疑这是不是一个非常明智的路径往下走,但在理论上,至少,它可以工作。)
有趣的事实:子模块现在可以跟踪分支。 –
@DuncanXSimpson:因此*有一些方法可以将子模块从其特定的提交中移除,其中包括通过分支名称检查分支的方法。这些需要运行特定的git子模块命令... *您必须设置分支的名称(我认为您可以保存在提交的'.gitmodules'文件中),然后运行'git submodule update --remote'或'git子模块结帐--remote'。 – torek