何时使用git子模块

使用子模块很棘手,因此我们为它们推荐了一些最佳用例。

  • 如果子项目变化太快或者即将发生的变化会破坏 API,为了安全起见,将代码锁定到特定的提交。
  • 如果某个组件不经常更新,并且我们希望将其作为供应商依赖项进行跟踪。
  • 如果我们向第三方代表项目的一部分,并且我们希望在特定时间集成他们的工作(仅在更新不太频繁时才有效)。
  • 如果技术环境允许打包和正式的依赖管理,你应该使用子模块。
  • 如果代码库很大并且我们不想每次都获取它,请使用子模块以免让协作者获取代码库的整个块。

在子模块中推送更新

由于子模块是一个单独的存储库,我们可以通过在子模块的目录中执行命令来像普通 Git 存储库一样推送它。

在子模块内进行新提交仍将指向旧提交。
如果我们也想在主存储库中进行更改,我们应该指示主存储库使用子模块的最近提交。
当我们在主存储库中运行 git status 时,子模块将位于“Changes not staged for commit”中,文本为“modified content”。
这将在与主存储库指向的不同提交上检出子模块代码。
要使主存储库指向新提交,请运行 git add 命令,提交并推送它。

子模块是将项目保存在单独存储库中的好方法,但仍然能够将它们作为其他存储库工作目录中的文件夹进行引用。
但是,考虑到对于很多项目,子模块不是最佳实践,并且使用它们很棘手。

Git 子模块的命令

要为现有存储库创建新子模块,请使用 git submodule add。
这组命令创建一个新目录,输入它,并将其初始化为一个新的存储库:

mkdir git-submodule-demo
cd git-submodule-demo/
git init
Initialized empty Git repository in /Users/example/git-submodule-demo/.git/

要将子模块添加到新存储库,请运行以下命令:

git submodule add https://somehost/example/textexample
Cloning into '/Users/example/git-submodule-demo/textexample'...
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 8 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.

git submodule add 命令使用 URL 参数指向 git 存储库。
Git 立即克隆 textexample 子模块。
通过运行 git status 命令检查存储库的状态:

git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
 new file: .gitmodules
 new file: textexample

在存储库中创建了两个新文件:.gitmodules 和 textexample 目录。
我们可以使用 git commit 和 git add 命令将文件提交到原始存储库:

git add .gitmodules textexample/
git commit -m "added submodule"
[master (root-commit) d5002d0] added submodule
 2 files changed, 4 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 textexample

什么是git子模块

很多时候,代码存储库依赖于来自其他存储库的外部代码。
我们可以直接将外部代码复制粘贴到主存储库中,也可以使用语言的包管理系统的方法。
但是这两种方法的缺点是不能跟踪对外部存储库的更改。
Git 允许将其他称为子模块的 Git 存储库包含到单个存储库中。

子模块允许通过一个存储库跟踪多个存储库中的更改。
子模块是父存储库中包含在父存储库工作目录中特定路径中的存储库。
它们可以位于工作目录中的任何位置,并通过位于父存储库根目录的 .gitmodules 文件进行配置。
.gitmodules 文件包含有关子模块项目的 URL 和本地目录之间映射的元数据。
子模块支持添加、同步、更新和克隆子模块。
子模块只跟踪特定的提交,而不是 git 引用和分支。

git更新子模块

如果有人更新了子模块代码,团队成员应该更新它。
我们不能使用 git pull ,因为它只是检索子模块指向另一个提交的信息,而不是更新它的代码。

要更新子模块的代码,请运行以下命令:

git submodule update
Git子模块

克隆 Git 子模块

要克隆带有子模块的项目,我们应该使用 git clone 命令。

它将克隆带有子模块的目录,但不会克隆其中的文件。
你应该运行 git submodule init 和 git submodule update 。
第一个将使用 .gitmodules 文件中的映射更新本地 .git/config,后者将从子模块项目中获取整个数据并检查父项目中的映射提交。

git clone 命令的 -recursive 选项用于初始化和更新子模块。
或者只运行以下命令:

git clone /url/to/repo/with/submodules
git submodule init

拉取git子模块的代码

当你创建一个新的子模块时,团队的其他成员应该启动它。
要获取子模块的信息,首先要通过执行 git pull 来获取子模块的信息。
如果有新的子模块,我们将在 git pull 的输出中看到它。
然后你必须启动它们:

git submodule init

这将从子模块中提取代码并将其定位在配置的目录中。

日期:2020-06-02 22:16:34 来源:oir作者:oir