(为啥)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/.gitmodulesproject/.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 保留的不仅仅是指向子模块的指针吗?的主要内容,如果未能解决你的问题,请参考以下文章

Git:为啥“git分支”不列出所有分支?

git merge为啥会覆盖

为啥 git 不定期运行 git fetch?

为啥 git 在错误的目录中查找 git 安装? (OS X)

为啥我通过 git 登录 Overleaf 时遇到问题

为啥 Git 不忽略我指定的文件?