Composer 不会自动更新 Git submodules,但可通过配置 scripts 钩子实现:在 composer.json 中添加 post-install-cmd 和 post-update-cmd 脚本执行 git submodule update --init --recursive,确保环境已安装 Git 并配置好 submodule 访问权限,若 submodule 属于第三方包需保证其仓库正确包含 submodule 且有对应访问凭证,推荐使用封装脚本检查 .git 目录和 submodule 状态以避免非 Git 环境报错,最终通过 Composer 脚本机制触发 Git 操作完成自动更新。

Composer 本身不会自动更新 Git submodules,因为它的职责是管理 PHP 依赖,而不是处理版本控制逻辑。但你可以通过一些方式在 Composer 安装或更新时触发 submodule 的更新操作。
如果你的项目或某个 Composer 包使用了 Git submodules,并希望在 composer install 或 update 时自动拉取或更新这些 submodules,可以通过 Composer 的 scripts 功能来实现。
1. 在项目根目录的 composer.json 中添加脚本
你可以在 composer.json 的 "scripts" 部分添加命令,在安装或更新后自动执行 Git submodule 更新:
{
"scripts": {
"post-install-cmd": [
"git submodule update --init --recursive"
],
"post-update-cmd": [
"git submodule update --init --recursive"
]
}
}这样,每次运行 composer install 或 composer update 后,Composer 都会自动执行 submodule 的初始化和更新。
2. 如果 submodule 属于某个 Composer 包
如果 submodule 是某个第三方包的一部分,而该包是通过 Composer 引入的(比如从私有 Git 仓库加载),那么你需要确保:
- 该包的源代码仓库中已正确配置了 submodule
- 你在 composer.json 中使用 vcs 类型引入该仓库
- 目标机器上有权限访问 submodule 的 Git 地址(如 SSH 密钥配置)
然后同样通过上面的脚本触发更新。
3. 确保 Git 正确配置
submodule 更新需要 Git 支持,并且你的部署环境必须:
- 安装了 Git
- 能访问主仓库和 submodule 的远程地址
- 如果有私有 submodule,需配置 SSH 密钥或 Git 访问令牌
4. 可选:添加初始化检查
如果你想更安全地运行,可以写一个简单的 shell 脚本代替直接命令:
{
"scripts": {
"post-install-cmd": "sh ./scripts/update-submodules.sh",
"post-update-cmd": "sh ./scripts/update-submodules.sh"
}
}脚本内容(./scripts/update-submodules.sh):
#!/bin/bash
if [ -d ".git" ] && git submodule status | grep -q '.'; then
git submodule update --init --recursive
echo "Submodules updated."
else
echo "No submodules to update or not a git repo."
fi这样可以避免在非 Git 环境或没有 submodule 的情况下报错。
总结:Composer 不直接管理 submodules,但你可以利用它的脚本钩子(如 post-install-cmd 和 post-update-cmd)来自动执行 git submodule update --init --recursive,从而实现“自动更新”的效果。关键是配置好脚本、Git 权限和部署环境。
基本上就这些。










