通过 Git 的 post-checkout 钩子,在切换分支后自动检测 composer.lock 变更并执行 composer install,确保依赖同步。该脚本仅在分支切换时运行,检查文件变更且存在 composer.json 时触发安装,避免手动遗漏。需团队成员本地配置钩子并统一管理,提升协作效率,减少环境不一致问题。

在使用 Git 和 Composer 协同开发 PHP 项目时,经常会遇到切换分支或更新代码后依赖发生变化的情况。如果其他开发者修改了 composer.json 或 composer.lock 文件,当前环境可能缺少必要的依赖。为避免手动运行 composer install 的疏漏,可以通过 Git 的 post-checkout 钩子自动触发 Composer 安装流程。
什么是 post-checkout 钩子?
Git 提供了多种钩子(hook)机制,post-checkout 是其中之一,它在每次执行 git checkout 或 git switch 成功后自动运行。该钩子可以用来检测代码变更,并执行诸如清理缓存、重建依赖等自动化任务。
实现自动安装的思路
目标是:当 composer.lock 文件在切换分支后发生变化时,自动运行 composer install 来同步依赖。关键在于判断文件是否真正变更,避免无意义重复安装。
- 通过钩子获取上一个提交和当前提交的差异
- 检查 composer.lock 是否在变更列表中
- 若存在变更且当前目录有 composer.json,则执行 composer install
配置 post-checkout 钩子脚本
在项目根目录下创建或编辑 .git/hooks/post-checkout 文件:
#!/bin/sh # .git/hooks/post-checkout参数说明:
$1: 上一个 HEAD 的 SHA-1
$2: 新的 HEAD 的 SHA-1
$3: 是否是分支检出(1 表示是)
IS_BRANCH_CHECKOUT=""
只在切换分支时执行(避免 git pull 触发)
if [ "$IS_BRANCH_CHECKOUT" != "1" ]; then exit 0 fi
检查是否存在 composer.lock 文件
if [ ! -f composer.lock ]; then exit 0 fi
检查 composer.lock 是否在本次变更中被修改
if git diff --name-only "$1" "$2" | grep -qE '^composer.lock$'; then if [ -f composer.json ]; then echo "Detected change in composer.lock, running composer install..." composer install --no-interaction fi fi
保存后,赋予可执行权限:
chmod +x .git/hooks/post-checkout注意事项与优化建议
虽然此方案能提升协作效率,但也需注意以下几点:
- 仅限本地钩子:Git 钩子不会随仓库自动分发,团队成员需各自配置,可通过文档或初始化脚本统一管理
- 避免频繁安装:限制只在分支切换时运行,防止 git pull 等操作误触发
- 性能考虑:若项目依赖庞大,自动安装可能稍慢,建议提示用户首次检出时耐心等待
- 错误处理:可在脚本中加入日志记录或失败提醒,便于排查问题
基本上就这些。通过简单的钩子脚本,就能让 Composer 在代码切换后自动同步依赖,减少因环境不一致导致的“在我机器上能跑”问题。










