--prefer-source需配合--keep-vcs才生效,否则默认删除.git目录;必须包含source字段、网络可达、目录未预存dist包,三者缺一不可。

--prefer-source 不是加了就生效,它只在包本身提供 source 字段、你本地能 git clone 通、且没被已安装的 dist 包“挡路”时才真正克隆仓库。
为什么 composer require foo/bar --prefer-source 后进 vendor/foo/bar 看不到 .git?
这不是命令失效,而是 Composer 在多个环节静默降级:
- 目标包的
composer.json没写"source"字段(只有"dist"),Composer 就当没这回事,直接走 zip 包下载 - 你之前装过这个包,
vendor/foo/bar目录已存在,--prefer-source默认跳过重装 - 网络连不上 Git 地址(比如 GitHub 被墙、私有仓库没配 SSH key 或 token),日志里只有一句
Cloning failed, falling back to dist,不报错也不提醒 - 即使克隆成功,Composer 默认执行
git clone --no-checkout+git checkout -qf <commit></commit>,然后删掉整个.git/目录——这是默认行为,不是 bug
怎么确认 --prefer-source 真生效了?别信输出,进目录查
操作顺序不能乱,验证必须三步到位:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先清空目标目录:
rm -rf vendor/foo/bar(或整个vendor) - 再跑命令:
composer require foo/bar --prefer-source --keep-vcs(--keep-vcs是关键,否则没.git) - 进目录验证:
cd vendor/foo/bar && git remote -v应输出原始仓库地址;ls -A | grep git必须看到.git;git log -n 1的 hash 要和composer show foo/bar --all输出里的source.reference一致
--prefer-source 和 --keep-vcs 必须一起用才支持调试
单独加 --prefer-source 只解决“从哪拉”,不解决“拉完留不留 .git”。要真能 git blame、切分支、临时打补丁,必须组合:
-
composer require foo/bar --prefer-source --keep-vcs(Composer 2.2+) - 或设环境变量:
COMPOSER_DISCARD_CHANGES=0 composer require foo/bar --prefer-source(兼容旧版) - 进目录后立刻
git status:应显示clean;若提示有未提交修改,说明之前有人动过,得先git stash或git reset --hard - 想长期改并推 PR?别直接
git commit到原origin。先git remote set-url origin git@github.com:yourname/bar.git换成你 fork 的地址,再改、再 push
只想对某一个包用源码,其他保持 dist 怎么办?
全局配置 preferred-install 容易误伤 CI 或生产环境,推荐按需控制:
- 新装时:
composer require foo/bar --prefer-source --keep-vcs - 已装但当前是 dist 模式:
composer update foo/bar --prefer-source --keep-vcs(会重拉) - 想让某个厂商所有包默认走 source:
composer config preferred-install '{"*": "dist", "foo/*": "source"}',但注意这仍需每个包自己提供source字段才生效 - 私有包务必在
repositories里声明{"type": "vcs", "url": "https://your-git-server/repo.git"},否则 Composer 根本不知道去哪 clone
最容易被忽略的是:即使所有条件都满足,vendor 里的源码也不等于“可复现构建”——同一 reference 下,git clone 可能因 submodule、.gitattributes 过滤规则变化而产出不同文件。调试时没问题,但千万别把它当成部署依据。










