卡在executing command且git submodule status报错,本质是子模块未初始化导致git无法识别仓库,需进入vendor对应目录手动执行git submodule update --init --recursive,并检查ssh/https访问权限、路径有效性及ci环境git配置。

卡在Executing command且git submodule status报错
这是最典型的子模块卡死现象:Composer 已完成依赖解析,正执行 git clone,但进入 vendor 包目录后发现 .git 存在而子模块未初始化,git submodule status 报 fatal: not a git repository 或直接空输出。
- 别急着删 vendor —— 先进到出问题的目录,比如
cd vendor/xxx/package,手动运行git submodule update --init --recursive - 如果失败,检查是否缺少 SSH key 或 HTTPS token:运行
git config --get remote.origin.url,确认是git@还是https://;私有子模块必须能被当前环境访问 - Windows 用户注意路径长度限制:若子模块嵌套过深,可能触发系统级拒绝,临时启用长路径支持(
reg add HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled /t REG_DWORD /d 1 /f)
post-install-cmd 钩子里的 PHP 脚本不执行
写了钩子却没生效,常见原因是路径判断失效或权限不足——is_dir('./vendor/xxx/package/.git') 返回 false,不是因为没 .git,而是 ./vendor 相对路径在钩子执行时已切换工作目录。
- 改用绝对路径判断:
@php -r "if (is_dir(__DIR__ . '/vendor/xxx/package/.git')) { chdir(__DIR__ . '/vendor/xxx/package'); system('git submodule update --init --recursive'); }" - 确保 Git 在 PATH 中:在 CI 或 Docker 环境里,运行
which git或git --version验证;Alpine 镜像需额外安装apk add git - 钩子只在
install和update成功后触发,若依赖解析失败,钩子根本不会跑——所以先解决Resolving dependencies卡顿,再谈子模块
想跳过子模块但 --prefer-dist 仍卡在 Cloning
--prefer-dist 本该走 ZIP 下载,但如果包的 composer.json 里声明了 "source": { "type": "git", ... },或仓库本身没打 tag,Composer 就会 fallback 到 --prefer-source,继续尝试 git clone。
- 强制禁用 source:加
--no-plugins --ignore-platform-reqs并配合--prefer-dist,避免插件干扰或平台检测触发回退 - 检查包元数据:访问
https://mirrors.aliyun.com/composer/p2/xxx/package.json(把 xxx/package 替换为实际包名),看dist字段是否存在且reference不为空;若全为source,说明上游没发布 dist 包 - 临时改用 path 类型:在项目
composer.json的repositories里加一条{"type": "path", "url": "./local-copy-of-package"},前提是本地已有含完整子模块的克隆
CI 流水线里子模块初始化失败
本地能跑通,CI 却反复失败,大概率是 Git 配置缺失或权限隔离导致子模块仓库不可达。
- 显式初始化:在 CI 脚本开头加
git submodule sync --recursive && git submodule update --init --recursive,不要依赖 Composer 钩子 - SSH 场景下,确保部署密钥已正确加载并能访问所有子模块仓库(包括嵌套层级);HTTPS 场景下,设置
GITHUB_TOKEN环境变量,并在.gitconfig里配置url."https://token@github.com/".insteadOf="https://github.com/" - Docker 构建时,
vendor目录若挂载为 volume,Git 操作可能因文件系统不一致失败——改用multi-stage build,在构建阶段完成全部composer install和子模块初始化,再 COPY 出来
Executing command)只是表象,真正要盯住的是子模块仓库本身的可访问性,以及 Composer 是否真的拿到了含 dist 元数据的包描述。











