'git submodule init'有什么意义?
背景
要填充存储库的子模块,通常需要调用:
git submodule init
git submodule update
在这个用法中, git submodule init
似乎只做了一件事:使用.gitmodules
信息填充.git/config
。
那是什么意思?
无法git submodule update
只是使用.gitmodules
的信息? 这将避免两个:
git submodule init
); 和 .gitmodules
内容到.git/config
)。 题
或者:
git submodule init
用例(在这种情况下,请赐教!); 要不然 git submodule init
是cruft,可以在Git中弃用而没有任何伤害。 其中哪些是真的?
假设存储库有10个子模块,并且您只对这些子模块感兴趣。 在这种情况下,您可能需要不时从远程存储库仅更新这两个子模块。 git init
对此很好,因为一旦你为这两git submodule update --remote
模块执行git init
命令, git submodule update --remote
只适用于它们。
如果有人喜欢我的回答,请用英文纠正我的错误。
附加了两个工作流程演示。
工作流程1:子模块是多个项目使用的libralies。
我认为这是常见的用例之一。
你只需克隆“我的项目”。
git clone https://example.com/demo/my-project
其结构表面如下图所示。
.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
你想重构引用lib1和lib2的代码code1.js
,这意味着你不需要克隆和签出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:每个子模块都是一个项目,一个大型项目包含它们。
我是这个的粉丝。
你克隆“主项目”。
git clone https://example.com/demo/main-project
其结构表面如下图所示。
你可以看到一个名为“shared”的目录。 此工作流程中有一条规则:如果要在项目中使用主项目的共享代码,则必须将该项目创建为主项目的子模块。
我喜欢将实体类放在如下所示的共享目录中。
回到子模块工作流程,.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
这次您想重构main-project的共享目录中的一些代码,并且您知道只有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
文档,有一个用例,表面上证明了git submodule init
作为独立命令的存在。
如果克隆存储库的用户希望为子模块使用不同于上游存储库指定的URL,则该用户可以:
git submodule init
vim .git/config # Alter submodule URL as desired, without changing .gitmodules
# or polluting history.
git submodule update
链接地址: http://www.djcxy.com/p/92409.html
上一篇: What is the point of 'git submodule init'?
下一篇: forgot to use