我正在使用 Sharelatex(github) 开发一个网站,但它包含用于构建主项目的其他存储库。 [...] 我在 git 中遇到了子模块,但由于主项目不包含任何子模块之类的东西,我无法使用它。
实际上,你确实有一个子模块。这就是嵌套存储库,并且(我对此很认真)就您需要了解 grok 子模块的内容而言,这就是all还有子模块。要理解子模块,假设您有一个嵌套存储库(确实如此)并考虑管理要求,需要做什么来支持 dvcs 中的设置。
对于初学者来说,当人们克隆一个使用某个存储库中的子模块的项目时,您都决定包含已发布的提交,该克隆显然也不会获得子项目存储库(当然它不应该获得您的私有和天知道什么-你已经完成的版本)。因此,他们还必须从其自己发布的某个存储库中获取子项目存储库。
您如何告诉获取您提交的人们在哪里获取必要的子项目提交?简单地说,您必须在提交的文件中的某个位置添加一条注释,说明“这是一个应该包含任何所需的 $subproject 提交的存储库”。git submodule
已决定.gitmodules
作为存储此类笔记的传统位置。
接下来:好吧,如果你提供给他们的网址离线了,其他人该怎么办?他们显然需要使用另一个存储库。因此,.gitmodules
只是建议,git submodule
命令使用当前值.git/config
, which git submodule init
已从 .gitmodules` 中的建议填充。
git submodule
的操作是all像这样。忘掉它。在您需要一些帮助来完成您已经发现需要做的事情之前,甚至不必费心查看命令。从知识开始,一个简单的事实是,子模块只不过是一个嵌套存储库,并且使用它的项目仅提交一个应该位于该嵌套存储库中某处的提交 ID。就是这样。这就是子模块的全部内容。
当你遇到需要做的繁琐任务时,寻找一个git submodule
为您执行这些操作的子命令。您不必使用子命令。该子命令所做的就是自动执行简单的任务,否则这些任务将很费力。它是一个工具包,可以做你需要做的任何事情,而且它不可能或应该向世界上的每个人强加一些任意且充分的(
也就是说,有一项重要的安全措施git submodule update
and git submodule add
当他们执行以下操作时为您执行git clone
为你。存储库通常在[子]项目顶层下具有实际的存储库内容.git
,但是如果您检查一个没有该子项目的分支,或者需要或希望该子项目消失,那么它.git
也会消失——这不是你想要的,因为它不仅包含你签出的内容,还包含整个实际的存储库。所以当git submodule update
进行初始克隆,它提升子模块的.git
目录到包含项目的存储库中的一个方便(且任意)的小角落,并替换.git
它刚刚从子模块中移出的目录.git
包含移动目录的相对路径的文件。
要在您当前拥有的存储库上完成初始提升,请将其移出当前存储库,从您放置的位置添加和更新,然后修复上游 url.gitmodules
为了其他人的方便。
那里。现在您已经完全了解了理解 git 子模块所需的一切,并且只有在您发现需要时才逐步获取详细信息,以了解git submodule
命令正在为您做事,以及为什么您实际上不必关心预先了解其联机帮助页上的每一个小细节。至少,我是这么认为的。
如果我错过了任何重要的内容,我会非常高兴(温和或直率,我真的不在乎)评论中的更正。