我试图设置一个分支,branchA
包含子文件夹A
和B
,但B
包含branchB
的内容。
我一直在关注submodules
,subtrees
和subrepos
,但我无法弄清楚我会在做什么。
为了防止这种情况成为XY问题,我的总体情况是:我正在开发HTML5 / JS游戏,我希望能够在Github Pages上进行测试。
所以我希望branch /子目录gh-pages/play
包含分支master
。
答案 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
”。
(显然这整个事情有点容易出错,一般都是子模块。我怀疑这不是一条非常明智的道路。但从理论上讲,它至少可以起作用。)