假设仓库中有 10 个子模块,你只对其中两个子模块感兴趣。在这种情况下,你可能只想不时从远程仓库获取这两个子模块的更新。使用 git init
可以很好地解决这个问题,因为一旦你对这两个子模块执行了 git init
命令,git submodule update --remote
就只会针对它们应用。
新增了两个工作流示例。
工作流1:子模块是多个项目共同使用的库。
我认为这是最常见的用例之一。
你只是克隆了 "my-project"。
git clone https://example.com/demo/my-project
它的结构表面如下图所示。
![在此输入图片描述](https://istack.dev59.com/KPLzT.webp)
.gitmodules的内容
[submodule "lib1"]
path = lib1
url = https://example.com/demo/lib1
[submodule "lib2"]
path = lib2
url = https://example.com/demo/lib2
[submodule "lib3"]
path = lib3
url = https://example.com/demo/lib3
[submodule "lib4"]
path = lib4
url = https://example.com/demo/lib4
你想重构代码code1.js
,它引用了lib1和lib2,这意味着你不需要克隆和检出lib3和lib4。所以你只需运行以下命令。
git submodule init lib1 lib2
现在让我们来看看.git/config
的内容。
...
[submodule "lib1"]
active = true
url = https://example.com/demo/lib1
[submodule "lib2"]
active = true
url = https://example.com/demo/lib2
这意味着类似于“准备从example.com/demo更新lib1和lib2”。此时,lib1和lib2目录为空。您可以使用一个命令克隆和检出lib1和lib2:
git submodule update
现在,您可以重构code1.js
而不会出现导入错误。
子模块只是指向特定提交的引用。因此,当您想将库更新到新版本时,您必须更新这些引用。您可以通过以下命令来完成。
git submodule update --remote
现在你可以看到只初始化所需的子模块是多么有用。
工作流2:每个子模块都是一个项目,一个大型顶级项目包含它们。
我喜欢这个。
您克隆“main-project”。
git clone https://example.com/demo/main-project
它的结构表面如下所示。
![图片描述](https://istack.dev59.com/MlLu2.webp)
你可以看到一个名为“shared”的目录。在这个工作流中有一条规则:如果你想在你的项目中使用主项目的共享代码,你必须将项目创建为主项目的子模块。
我喜欢把实体类放在像下面这样的共享目录中。
![图片描述](https://istack.dev59.com/1fAJP.webp)
回到子模块工作流,.gitmodules文件的内容如下所示。
[submodule "sub-project1"]
path = sub-project1
url = https://example.com/demo/sub-project1
[submodule "sub-project2"]
path = sub-project2
url = https://example.com/demo/sub-project2
[submodule "sub-project3"]
path = sub-project3
url = https://example.com/demo/sub-project3
[submodule "sub-project4"]
path = sub-project4
url = https://example.com/demo/sub-project4
这次你想要重构主项目中共享目录的一些代码,你知道只有 sub-project1 和 sub-project2 引用了共享代码,这意味着你不需要克隆和检出 sub-project3 和 sub-project4。所以你只需运行下面的命令。
git submodule init sub-project1 sub-project2
就像我在workflow1中提到的那样,您需要运行以下命令来克隆和检出它们。
git submodule update
在这种情况下,我需要执行 git submodule update --remote
吗?或者说,我是否必须初始化并更新子模块以重构共享目录中的代码?是的,因为在重构共享代码后,您必须运行子模块中的测试,如果在您重构时提交并推送了任何子模块的更新到远程存储库,那么您需要使用 git submodule update --remote
命令来获取它们。
git submodule update && git submodule init
,这样做的目的是什么? - Charlie Parker