(为啥)git super-repository 保留的不仅仅是指向子模块的指针吗?
Posted
技术标签:
【中文标题】(为啥)git super-repository 保留的不仅仅是指向子模块的指针吗?【英文标题】:(Why) does git super-repository keep anything more than a pointer to submodules?(为什么)git super-repository 保留的不仅仅是指向子模块的指针吗? 【发布时间】:2016-04-23 01:40:11 【问题描述】:使用 git 子模块时,为什么要添加一个 project/.git/modules/<submodule name>/
文件夹,其中包含似乎是(子模块的副本?)存储库的内容?
更新
好的,这就是我的感觉(在我的情况下,一切都是本地的,我指的是它不必在哪里)
absolute/path/to/actual/<submodule>/.git
~= (本地)远程仓库project/.git/modules/<submodule>/
~= 本地克隆仓库project/path/to/<submodule>/
= 本地结帐 本地克隆回购
local checkout 的更改与 local clone repo 不同,后者可以(但不是自动)与 (local) remote repo.*
(local) remote repo 被签入/absolute/path/to/actual/<submodule>
(或其他任何地方)的事实只是偶然的。它和project
之间根本没有(直接)关系。
*:即更新(本地)远程仓库,以便任何project X
可以合并对project
中的子模块所做的可互用更改。
这意味着对于 本地克隆 repo,我可以有许多未推送的更改(分支等),这些更改是 project
的本地。其中一些我永远不想推送到(本地)远程仓库,因为它们不能在项目之间互用。
【问题讨论】:
如果是副本,您能告诉我原始存储库在哪里吗?提示:如果你不能,那是因为那不是副本;-) 子模块存储库?它位于至少两个都引用的本地路径(似乎也是多余的?)project/.gitmodules
和 project/.git/config
。
【参考方案1】:
这是因为 git 子模块是一种将另一个 git 存储库的工作目录嵌入到项目的工作目录中的一种方式,它具有 git 提供的所有代码管理功能。
路径 project/.git/modules/<submodule name>
是子模块的实际 git 存储库(相当于“标准”克隆的 project/.git
),而 project/path/to/<submodule name>
是工作目录。这样做的原因是它允许您将 project/path/to/<submodule name>
的内容作为完整的 git 存储库进行操作(您可以签出新的提交,而不必以某种方式从其他位置复制它们)。
基本上,子模块从项目的根目录中按照git clone --separate-git-dir=.git/modules/<submodule name> <submodule origin> path/to/<submodule name>
的行进行克隆。
值得注意的是,这仅存在于存储库的克隆(非裸)版本中。实际的存储库本身确实只包含对子模块的引用(路径、来源和提交)。
【讨论】:
谢谢 我认为这确实增加了我对子模块的理解。接受并更新了原帖。如果我错过了什么,请随时发表评论!以上是关于(为啥)git super-repository 保留的不仅仅是指向子模块的指针吗?的主要内容,如果未能解决你的问题,请参考以下文章