扩展@Greduan 和我的评论:
您可以将本地 git 存储库添加为带有git submodule add <repo> <path>
.
根据 Git SCM 文档submodule add
:
这至少需要一个参数:<repository>
. 可选参数<path>
是克隆子模块存在于超级项目中的相对位置。
TL;DR:如果<repo>
和<path>
相同,则可以避免将子存储库克隆到父存储库
现在,举个例子(我很想知道这实际上是如何工作的,我想我会尝试一下并发布我的结果):
假设我们有一个父 repo in./
和一个子 repo in ./some/folder/child-repo
。
您可以添加子模块而无需通过以下方式克隆它:
git submodule add ./some/folder/child-repo ./some/folder/child-repo #same location
这将child-repo
在其当前位置添加作为子模块。
Git 将输出如下内容:Adding existing repo at 'some/folder/child-repo' to the index
.
如果您运行git status
,您应该会看到两个准备提交的新文件:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: .gitmodules
# new file: some/folder/child-repo
#
.gitmodules
是描述您的模块的文件,另一个文件是子存储库表示。
将子模块提交到父仓库:git commit -m 'add child-repo as submodule'
此时,您在子存储库中所做的任何提交都将显示在父存储库中,如下所示:
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: some/folder/child-repo (new commits)
#
然后,您可以运行git submodule update
以更新父存储库。你有它 - 没有不必要的重复或额外的提交:)
警告:如果您submodule update
在父代码库中运行后需要使用子代码库,您会发现子代码库将处于分离的 HEAD状态。这记录在git submodule
手动更新部分。
git checkout master
您可以在子存储库中使用(或您正在使用的任何分支)修复它。