必须同时满足三个条件才能在 vendor 里看到 .git 目录:包本身声明了 source 字段、使用 --prefer-source、还加了 --keep-vcs——缺一不可;--prefer-source 仅触发 git clone,但默认会删除 .git 目录,不加 --keep-vcs 则无法保留仓库结构。

必须同时满足三个条件才能在 vendor 里看到 .git 目录:包本身声明了 source 字段、你用了 --prefer-source、还加了 --keep-vcs —— 缺一不可。
为什么加了 --prefer-source 还没.git?
因为 --prefer-source 只负责让 Composer 改用 git clone,但默认行为是 clone 后立刻删掉 .git/ 目录(省空间、防部署污染)。你看到日志里有 Cloning abc123 from https://...,不代表最终目录里真有 .git。
- 不加
--keep-vcs,git remote -v一定报fatal: not a git repository - 只加
--prefer-source不加--keep-vcs,ls -a | grep git也看不到.git - 验证是否生效的唯一方式是进
vendor/xxx/yyy后执行git status,不是看有没有.git子目录(旧版 Composer 会留空目录)
镜像源(如阿里云)会让 --prefer-source 失效吗?
会,但不是“失效”,而是根本没机会触发——镜像源只代理 packages.json 和 dist ZIP 包,git clone 请求压根不走镜像,直接连原始 Git 地址(GitHub/GitLab)。如果该地址被墙、或你的机器没配 SSH key/token,就会 fallback 到 dist 并静默失败。
- 执行
composer install --prefer-source --keep-vcs时,观察日志里是否出现Cloning行;如果没有,大概率是镜像配置干扰了元数据拉取 - 临时禁用镜像:
composer config --global repo.packagist composer https://packagist.org - 私有 GitLab 地址必须能直连:
git ls-remote https://gitlab.example.com/group/pkg.git要能返回结果
如何确认某个包到底支不支持 source 模式?
别猜,直接查它的元数据。Composer 是否能 clone,完全取决于包作者在 composer.json 里有没有写 "source" 字段,且字段里包含 "type": "git" 和有效 "url"。
- 运行
composer show vendor/package --all,找source:这一行;为空或显示none就不支持 - 检查
composer.json中"type"是不是"metapackage"或"library"—— 这些类型即使有source字段,Composer 也可能忽略 - 手动访问
source.url地址,确认能否用git clone命令成功拉下来(注意协议:https://需 token,git@需 SSH key)
最容易被忽略的点是:即使所有条件都满足,composer.lock 文件里记录的是上次安装时的 type(dist/source),它会强制 composer install 复用旧方式。想彻底切换,要么删 lock 文件重装,要么对单个包用 composer update vendor/package --prefer-source --keep-vcs。











