背景
要填充存储库的子模块,可以使用typically invokes:
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
很粗糙,可以在Git中弃用,不会造成任何伤害。
以下哪一个是正确的?
3条答案
按热度按时间3bygqnnd1#
假设仓库有10个子模块,而你只对其中的两个子模块感兴趣,那么你可能需要不时地从远程仓库获取这两个子模块的更新。
git init
很适合这种情况,因为一旦你对这两个子模块执行了git init
命令,git submodule update --remote
就只适用于它们。附加了两个工作流演示。
工作流程1:子模块是多个项目使用的库。
我认为这是常见的用例之一。
你刚刚克隆了"我的项目"。
它的表面结构就像下面。
. gitmodules的内容
您希望重构引用lib1和lib2的代码
code1.js
,这意味着您不需要克隆和 checkout lib3和lib4,因此您只需运行以下命令。现在,让我们看看
.git/config
的内容This means something like "Ready to update lib1 and lib2 from example.com/demo".
此时,lib1和lib2目录为空。您可以使用一个命令克隆和 checkout lib1和lib2:
现在,您可以重构
code1.js
,而不会出现导入错误。子模块只是对某些提交的引用。所以当你想把库更新到新版本时,你必须更新引用。你可以通过下面的命令来完成。
现在您可以看到只初始化所需的子模块是多么有用。
工作流程2:每个子模块都是一个项目,一个大的顶级项目包含它们。
我很喜欢这个。
您克隆"主项目"。
它的表面结构就像下面。
您可以看到一个名为"shared"的目录。此工作流中有一个规则:如果你想在你的项目中使用主项目的共享代码,你必须创建一个项目作为主项目的子模块。
我喜欢把实体类放在共享目录中,如下所示。
回到子模块工作流,. gitmodules的内容如下所示。
这一次,您希望重构主项目的共享目录中的一些代码,并且您知道只有sub-project1和sub-project2引用共享代码,这意味着您不需要克隆和 checkout sub-project3和sub-project4,因此您只需运行下面的命令。
正如我在workflow1中提到的,您需要运行下面的命令来克隆和 checkout 它们。
在这种情况下,我会使用
git submodule update --remote
吗?或者我甚至需要初始化和更新子模块来重构共享目录中的代码吗?是的,因为在重构共享代码之后,您必须在子模块中运行测试,并且如果在重构时提交了任何子模块的更新并将其推送到远程存储库,那么您需要在git submodule update --remote
之前获得它。kcugc4gi2#
阅读
git submodule
documentation,有 * 是 * 一个用例,表面上证明git submodule init
作为一个独立的命令存在。如果已克隆资料档案库的用户希望对子模块使用与上游资料档案库指定的URL不同的URL,则该用户可以:
eimct9ow3#
据我所知,这就是命令所做的&因此需要的顺序: