外观
简介
Git 的子模块(Submodule)是一种机制,允许在一个 Git 仓库中嵌套另一个 Git 仓库。这使得你可以将外部项目作为子目录包含在你的项目中,同时保持各自的版本控制独立性。 主要作用:
- 模块化管理: 将大型项目拆分为多个子模块,便于独立开发和维护。
- 代码重用: 在多个项目中共享相同的子模块,避免重复开发。
- 依赖管理: 将第三方库作为子模块集成,方便版本控制和更新。
(没错,和 pnpm workspace 配合使用,效果····不知道,没在生产用过😭😭😭😭😭)
不多比比,直接拿上个文章中的项目,上操作
使用 git Submodules
首先,确保你的 Git 版本号大于 1.5.3,因为 Git 1.5.3 之后才引入的 Submodules。
初始化主项目
bash
git init
先给主项目搞个仓库记得不要把 vue-one 和 vue-two 提交了!!! 这俩不需要在主包里提交,也不要设计到忽略文件里!!!
添加子项目
首先,给在子项目文件夹下(vue-one 和 vue-two)执行:
bash
# 初始化仓库(如果当前目录还不是 Git 仓库)
git init
# 添加远程仓库
git remote add origin https://github.com/xxx/xxx.git
# 切换到 master 分支(如果当前分支不是 master)
git checkout -b master origin/master
# 从远程仓库拉取最新代码
git pull origin master
然后 将 子模块 添加到主项目里:
bash
# git submodule add <子模块仓库URL> <子模块目录>
git submodule add https://github.com/xxx/xxx.git vue-one
运行后会在 libs/library 目录下克隆子模块,并在主仓库根目录生成一个 .gitmodules 文件,内容如下:
plaintext
[submodule "packages/vue-one"]
path = packages/vue-one
url = https://gitee.com/MR-lfc/platform_vue-one.git
[submodule "packages/vue-two"]
path = packages/vue-two
url = https://gitee.com/MR-lfc/platform_vue-two.git
将子模块推送到仓库后, 在主项目 中执行:git status
可以看到 类似于 下面的信息: modified: packages/vue-one (new commits)
这里可以用 git add packages/vue-one
将子模块的变更提交到主仓库。 将 .gitmodules 文件提交到主仓库,这样其他开发者在 clone 主仓库时就会自动将子模块 clone 下来。 demo图: 点击 vue-one 或 vue-two 可以快速跳转到对应的子模块
克隆包含子模块的仓库 (可视化工具中有递归子模块的选项,例如 sourcetree)
首先克隆 主仓库
bash
git clone <主仓库URL>
cd main-project
成功后 初始化并更新子模块
bash
git submodule init # 初始化子模块
git submodule update # 下载子模块内容
或者
bash
git clone --recurse-submodules <主仓库URL>
更新子模块
bash
cd packages/vue-one
git pull origin master # 拉取子模块仓库的最新代码
执行完成后,回到主仓库,提交更新子模块的引用:
bash
cd ../../
git add packages/vue-one
git commit -m "Update submodule vue-one"
移除子模块
- 删除子模块记录:
git submodule deinit <子模块路径>
- 删除子模块目录:
rm -rf <子模块路径>
- 删除 .gitmodules 文件中的子模块条目并提交
git add .gitmodules git commit -m "Remove submodule"
- 删除 Git 配置中的子模块信息:
git rm --cached <子模块路径>
注意事项
- 子模块版本固定: 主仓库只记录子模块的特定提交,拉取子模块时不会自动更新到最新版本,需手动更新。
- 子模块独立性: 子模块的 .git 文件存储在子目录中,彼此独立。
- 复杂度增加: 使用子模块需要额外管理子模块的初始化、更新和版本控制。