“如何转向”;“开和关”;基于repo状态的git子模块设计

“如何转向”;“开和关”;基于repo状态的git子模块设计,git,Git,假设我有三份回购协议,孩子,父母和祖父母parent有一个子模块child,grandparent有两个子模块parent和child 我想要实现的是,当parent本身是一个独立的回购协议(而不是另一个回购协议的子模块)时,parent仅签出(或初始化并更新)子回购协议。当父项是祖父母的子模块时,它不会签出自己的子项,而是使用祖父母提供的子项。我这样做的原因是因为孩子和父母是大茎回购,祖父母是叶子。因此有许多不同的祖父母回购协议,每个协议的子模块都指向子和父中的不同提交。由于子项很大,我不想在

假设我有三份回购协议,
孩子
父母
祖父母
parent
有一个子模块
child
grandparent
有两个子模块
parent
child

我想要实现的是,当
parent
本身是一个独立的回购协议(而不是另一个回购协议的子模块)时,
parent
仅签出(或初始化并更新)
子回购协议。当
父项
祖父母
的子模块时,它不会签出自己的
子项
,而是使用
祖父母
提供的
子项
。我这样做的原因是因为
孩子
父母
是大茎回购,
祖父母
是叶子。因此有许多不同的
祖父母
回购协议,每个协议的子模块都指向
中的不同提交。由于
子项
很大,我不想在
父项
中保留另一份副本。更准确地说,
child
是一种包含各种数据和资产的资产回购
parent
是数据的解析器。而
祖父母
是使用解析器访问资产的应用程序。由于不同的应用程序在采用数据和解析器repo中所做的更改方面的进度略有不同,因此我需要将“child”和“parent”作为子模块直接添加到
祖父母
,以更好地控制源代码,而不是让
简单地坐在
中,成为
的子模块。我还希望
parent
有自己的
child
副本,因为
parent
的开发是独立的,不受任何
祖父母的影响

三份回购协议的文件结构如下:

grandparent
|-- src
|-- include
|-- submodules
    |-- parent
        |-- src
        |-- include
        |-- submodule
            |-- child (trying to make this one not being checked out here)
    |-- child (this one should be checked out)

parent
|-- src
|-- include
|-- submodules
    |-- child (this one should be checked out)

child
|-- audio
|-- video
|-- pics
|...
有可能实现我所描述的吗?或者,在这种情况下,什么是最佳实践。

鉴于(更新的)情况,我建议避免递归子模块模式,只需在
祖父母
repo的工作树中手动(或编写脚本?)执行任何必要的
git子模块更新
命令。即:

git克隆$url祖父母
cd祖父母
git子模块更新--init
.gitmodules
(在
git克隆
之后的
.gitmodules
中,以及在
cd
命令之后的
.gitmodules
中找到)将列出
子模块/父级
子模块/子级
的URL。当
git clone
到达克隆的最后一步(签出)时,在由
git clone
创建的新
grandrent
目录中进行的签出将同时填充git的索引和工作树,以便
submodules/parent
submodules/child
都在索引中记录一个哈希ID。然后,
git子模块更新--init
将认识到它需要运行两个
git clone
git checkout
命令来填充
submodules/parent
submodules/child

由于递归已关闭(并且未告知
git子模块更新
将其打开),因此
parent
的克隆会留下一个未克隆的子模块:
submodules/parent/submodule/child
此时只是一个空目录。只要没有人运行该命令:

(cd submodules/parent && git submodule update --init)

或者等效的,该目录将继续保持为空。

祖父母(超级回购?)不能直接向孙辈提供哈希ID,因为祖父母中存储的唯一内容是中间回购的一对。中间repo的工作是为孙子提供一对,而这对来自提交,这意味着中间必须存在正确的提交。现在,中间的哈希ID确实来自提交并进入中间的索引,因此如果您能够以某种方式将哈希ID放入该索引中,你可以做到这一点。但这就留下了“不知何故”的部分有待定义。另一方面,你画的图片没有祖父母/中间人/孙辈结构,而是一个有两个孩子的超级回购(父母)。两个子模块中的一个子模块将另一个子模块作为自己的子模块。在这种情况下,您可以简单地让父repo本身签出这两个子模块。但他们将是并排的,而不是父母/孩子的关系。(我想你在课文中说了所有这些,但我试图确保每个人对这里的设置都有相同的想法,因为这才是真正的诡计所在。)@torek谢谢!是的,
super-super-repo
的文件结构如图所示,
super-super-repo
可以直接将两个子模块的散列值存储在自身中。因为有很多不同的
超级超级回购
s,我不知道如何存储
超级回购
中间回购
中所需的特定
子子回购
的提交哈希。而且因为中间回购实际上是单独开发的,所以在技术上也很难做到。哦,是的,这成功了!我不知道我可以检查特定的子模块。快速跟进-是否有良好的做法将文件放在未签出的空子模块文件夹中,表明此文件夹未被使用,用户应参考其他位置?我可以用一些bash脚本来实现这一点,但我只是想知道git是否提供了一些现成的解决方案来在未初始化的子模块的文件夹中放置一些占位符。我不知道这方面有什么标准做法。顶层文档/构建说明/自述文件中关于子模块的结构和使用的注释,请参见