Composer create-project保留git信息 keep-vcs参数使用【技巧】

8次阅读

默认情况下 composer create-project 会删除目标目录的 .git,需加 –keep-vcs 才保留原始 Git 历史和配置;它不自动拉取或切分支,仅保留现场,且不兼容已存在 .git 的目录。

Composer create-project保留git信息 keep-vcs参数使用【技巧】

默认情况下 composer create-project 会清空目标目录里的 .git 目录,即使源项目是 Git 仓库,新生成的项目也不再是 Git 工作区。想保留原始提交历史和远程配置?必须显式加 --keep-vcs 参数。

为什么 --keep-vcs 不是默认行为

Composer 设计上把 create-project 当作“模板初始化”而非“克隆”,目的是避免意外继承上游仓库的 origin、分支状态或敏感钩子。但如果你明确要复刻整个 Git 上下文(比如 fork 后二次开发),跳过清理就很有必要。

  • 不加 --keep-vcs:Composer 会 rm -rf .git,然后执行 install
  • 加了之后:只删 vendor/ 和生成的文件,保留原 .git/HEADconfig
  • 注意:它不会自动 git pull 或切换分支,只是保留现场

--keep-vcs 的典型使用场景

适用于需要延续原始仓库生命周期的操作,不是所有项目都需要它。

  • 基于某个开源包(如 laravel/laravel)快速搭建私有项目,并希望后续能 git diff upstream/main 对比变更
  • 团队内部维护一个带定制脚本和 CI 配置的模板库,每个新项目都应继承其完整 Git 历史
  • 在 CI 中动态生成项目骨架,同时要求产物可追溯到模板仓库某次 tag

容易被忽略的副作用和限制

--keep-vcs 看似简单,但几个边界情况常导致误操作:

  • 如果目标目录已存在且含 .git,Composer 会报错退出,不会覆盖 —— 必须先清空或换路径
  • 原始仓库若用了 Git 子模块(.gitmodules),--keep-vcs 不会自动 git submodule update --init,得手动补
  • 某些包的 composer.jsonpost-create-project-cmd 脚本,它们仍会运行,可能干扰原有 Git 状态(例如重写 .git/config
  • windows 下若原始 .git 权限异常,可能导致 git status 报错,建议随后运行 git config --local core.autocrlf true 修复

真正起作用的只有 --keep-vcs 这一个参数,别信网上说的 --no-install--prefer-source 能替代它;后者影响的是依赖拉取方式,跟项目根目录的 Git 元数据完全无关。

text=ZqhQzanResources