必须用composer install --prefer-source --keep-vcs才能在vendor中修改代码、执行git blame、切换分支;否则Composer默认克隆后删除.git目录,导致git status报错“not a git repository”。

想在 vendor 里直接改依赖、git blame 查问题、切 dev-main 分支验证修复?--prefer-source 不是“加速调试”的魔法开关,而是把包从 ZIP 解压变成 Git 克隆——但克隆完默认删掉 .git,你看到的仍是“影子拷贝”,不是真仓库。
为什么 vendor/package 里执行 git status 报错 “not a git repository”
这是最常被忽略的默认行为:Composer 即使成功 git clone,也会立刻执行 git clone --no-checkout + git checkout -qf <commit>,然后 删除整个 .git 目录。结果就是代码干净、体积小,但你失去了所有 Git 能力。
- 验证方式:进
vendor/foo/bar后运行ls -a | grep .git,没输出就说明被删了 - 真正生效的命令必须带
--keep-vcs:composer install --prefer-source --keep-vcs - 旧版 Composer(--keep-vcs,得用环境变量:
COMPOSER_DISCARD_CHANGES=0 composer install --prefer-source - 加了
--keep-vcs后,git remote -v才能看到原始仓库地址,git log才能翻历史
composer install --prefer-source 没效果?先确认三件事
命令跑完却没进源码模式,大概率卡在这三个环节:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.json里该包没声明"source"字段(只写了"dist"),Composer 就静默 fallback 到 ZIP,不报错也不提醒 - 包已存在(
vendor/foo/bar目录非空),Composer 默认跳过重装——--prefer-source对已安装包无效,必须先rm -rf vendor/foo/bar或整个vendor - 网络或权限问题导致
git clone失败(比如私有 GitLab 没配 SSH key、GitHub 被墙),Composer 自动降级走 dist,日志里只有模糊的Cloning failed, falling back to dist
怎么只让某一个包走 source,其他保持 dist
别用全局 --prefer-source,它会影响所有包,CI 构建变慢、磁盘暴涨。精准控制靠两步:
- 先清掉目标包:
rm -rf vendor/foo/bar - 单独安装它:
composer require foo/bar --prefer-source(或composer update foo/bar --prefer-source) - 注意:如果
composer.lock里记录的是 dist 方式,composer update可能仍沿用旧方式,此时需加--with-dependencies或删 lock 后重装 - 长期方案是在
composer.json的config.preferred-install里按 pattern 配置,例如:{"*": "dist", "foo/*": "source"}
调试时改了 vendor 代码,下次 composer update 却被覆盖
因为 Composer 拉的是 composer.lock 里锁定的 source.reference(通常是 commit hash),不是分支名。哪怕你在 dev-main 上改了,update 还是会重置回那个固定 commit。
- 临时保存修改:进目录后立即
git add -f . && git commit -m "wip",避免被覆盖 - 长期修改建议用 path repository:
"repositories": [{"type": "path", "url": "./local/foo"}],指向本地可写副本 - 别直接在
vendor提交到上游——先git remote set-url origin git@github.com:yourname/bar.git换成可写地址再 push - 副作用明显:
--keep-vcs后vendor体积可能翻 10 倍,某些部署脚本会递归删.git,导致下次update失败

















