跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何让Composer在更新包时保留.git目录?(--prefer-source)

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
GitHub CopilotGitHub AI编程工具,实时编程建议下载 若输出
.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
减少干扰

相关文章