Git Submodule

Apr 20, 2024 · 4min

在项目中需要使用到 gRPC,无论是前端还是后端都需要使用同一份 proto 文件。
前端和后端分别存储在不同的仓库,例如 MojiChat 和 MojiChatServer,那么我需要将 proto 文件放在哪个仓库或位置比较好呢?如果将这两个存储库移动到同一个新的存储库中,再将 proto 文件放到这个存储库中那么就实现可以前后端公用一个 proto 文件。

这操作比较危险,而且如果有其它项目需要用到这个 proto 文件就得加入这个存储库,不太理想。

干脆直接创建一个存储库专门存储这个 proto 文件,例如:moji-chat-proto
如果需要使用这个 proto 直接 clone 这个存储库即可。通过 Git Submodule 可以完美解决我们这个问题!

通过 git submodule add 命令添加目标仓库(url 是目标地址 例如 ssh)

git submodule add <url> <target_path>
  • <url> - 是存储库地址
  • <target_path> - 是这个存储库在目标项目的存放地址

此时会在项目 root path 中添加 .gitmodules 文件,其内容为

[submodule "src-tauri/src/protos"]
  path = src-tauri/src/protos
  url = [email protected]:moji-open-source/moji-chat-proto.git

最后将其 push 到仓库即可,它不会将 git submodule 中的源码提交。

如果你 clone 一个存在 git submodule 的仓库,那么通过 git pull 命令只能克隆该项目本身而无法克隆其子模块。

如果需要克隆当前项目及其所有子模块,那么可以添加 --recursive 参数

git clone --recursive <url>

或者 git pull --recurse-submodules 拉取所有子模块

如果只是需要更新子模块,那么执行这个命令即可

# git 1.8.2 及以上版本
git submodule update --recursive --remote
# git 1.7.3 及以上版本
git submodule update --recursive
```

>

cd ..
CC BY-NC-SA 4.0 2024-PRESENT © Clover You