【Git 】Git 子模块管理:实现工程库独立更新与管理

一张包含的多个文件的文件夹图片

包含子模块项目

场景

想要在一个工程中使用另一个工程的库(工程库在不断更新,包含独立的提交记录)。

通过 submodule 可以实现在一个工程中引入另一个工程,同时保留二者的提交记录并区分开来。

目前 submodule 能够实现单独开发子工程,不会影响父工程。父工程可以在需要的时候更新子模块的版本,从而实现完全的分离,两者提交独立。将一个工程拆分成多个仓库并进行集中管理,实现更细粒度的访问。

这解决了仓库过于庞大时所出现的传输量大、提交记录冗杂、权限分配等问题。

git help submodule #查看本模块的帮助

git submodule [--quiet] [--cached]
git submodule [--quiet] add [<options>] [--] <repository> [<path>]
git submodule [--quiet] status [--cached] [--recursive] [--] [<path>…]
git submodule [--quiet] init [--] [<path>…]
git submodule [--quiet] deinit [-f|--force] (--all|[--] <path>…)
git submodule [--quiet] update [<options>] [--] [<path>…]
git submodule [--quiet] set-branch [<options>] [--] <path>
git submodule [--quiet] set-url [--] <path> <newurl>
git submodule [--quiet] summary [<options>] [--] [<path>…]
git submodule [--quiet] foreach [--recursive] <command>
git submodule [--quiet] sync [--recursive] [--] [<path>…]
git submodule [--quiet] absorbgitdirs [--] [<path>…]

一、添加子模块

# git submodule add <url> <path>
git submodule add https://github.com/yyy/xxx.git

推送添加的子模块

git push origin master

二、克隆含有子模块项目

git clone https://github.com/chaconinc/MainProject

# 用来初始化本地配置文件
git submodule init
# 该项目中抓取所有数据并检出父项目中列出的合适的提交
git submodule update

# 直接clone 包含全部
git clone --recurse-submodules https://github.com/chaconinc/MainProject

三、查看子模块

git submodule

Github 显示形式

如果将父项目推送到远程仓库(如 Github),在网页浏览该项目时子模块所在的目录会多一个类似 @70c316e 的后缀,即上面查看子模块命令输出内容的 hash 值的前面部分,点击这个目录会跳转到这个子模块对应的仓库地址(另一个 url)。

image-20210604214007823

四 、移动子模块

要移动 Git 子模块,你需要执行以下步骤:

1.修改 .gitmodules 文件

打开 .gitmodules 文件,它位于你的 Git 项目根目录下,其中包含了子模块的配置信息。在这个文件中,你会看到类似以下的条目:

[submodule "submodule_name"]
  path = path_to_submodule
  url = URL_of_submodule_repository

2.移动子模块文件夹

现在,你可以手动移动子模块的文件夹到新的位置。

3.更新 .git/config

在你移动子模块文件夹后,需要更新 .git/config 文件中子模块的路径。找到对应的子模块条目,修改 url 后面的路径为新的子模块路径。

4.更新 Git 索引

使用以下命令更新 Git 索引以反映子模块的移动:

git submodule sync

5.更新父项目

进入到父项目根目录下,并执行以下命令来更新父项目,让其记录子模块路径的变化:

git add .
git commit -m "Updated submodule path"

这样就完成了子模块的移动操作。确保在进行这些步骤之前备份重要的文件以防万一。

参考文章

[1] https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97

[2] https://knightyun.github.io/2021/03/21/git-submodule

[3] https://www.codenong.com/1777854/

发表评论

0 评论