Composer 默认用 dist 方式安装包(无 .git),启用 --prefer-source 可强制 git clone 保留完整仓库;支持与否取决于包是否在 composer.json 中声明 source 信息。

默认情况下,Composer 安装或更新包时会使用 dist(压缩包)方式,即下载 ZIP/TAR 归档并解压,这种模式下不会包含 .git 目录。若你希望在 vendor/ 中的包保留完整的 Git 仓库(含 .git/ 子目录),以便查看提交历史、切换分支、打补丁或参与开发,需强制 Composer 使用 source 方式 —— 即通过 git clone 拉取代码。
启用 --prefer-source 全局或单次生效
该选项告诉 Composer 优先从源码仓库(如 GitHub)克隆,而非下载发行版归档。
- 单次更新时加上参数:
composer update --prefer-source - 全局设置(永久生效):
composer config --global prefer-source true - 仅对某项目启用(推荐):
composer config prefer-source true(写入当前项目的composer.json的config段)
确认是否已成功拉取 source
执行后进入 vendor/monolog/monolog(以 monolog 为例)目录,运行:
ls -a | grep git
若输出 .git,说明已克隆为完整仓库;若无,则可能是包本身未配置 source 信息,或被缓存干扰。
注意:不是所有包都支持 source 模式
Composer 能否走 source 取决于包的 composer.json 是否声明了 source 类型仓库(如 "type": "git" 和有效 "url")。部分私有包或老旧包可能只提供 dist,此时 --prefer-source 会被忽略。
- 可手动检查包的元数据:
composer show monolog/monolog --all,关注source字段是否存在且非空 - 若缺失,可尝试在
repositories中显式添加 Git 仓库地址(适用于 fork 或私有库)
避免意外覆盖已有 .git 目录
如果之前用 dist 方式安装过某个包,再执行 --prefer-source 更新时,Composer 默认会先清空原目录再重新 clone —— 这会导致你手动添加的 .git 修改丢失。安全做法是:
- 先删掉对应
vendor/xxx/xxx目录(或整个vendor),再运行composer install --prefer-source - 或使用
composer update --prefer-source --no-scripts --no-plugins减少干扰










