Git凭据过期或错误导致Composer install卡在克隆阶段,需清理系统Git凭据缓存:Windows删凭据管理器中git:https://github.com条目,macOS执行git credential-osxkeychain erase并输入host和protocol,Linux临时禁用credential.helper后手动重输,CI环境则应通过GITHUB_TOKEN等密钥注入方式配置。

Git凭据过期或错误,Composer install直接卡在克隆阶段
Composer 本身不处理认证,它调用 git clone 时完全依赖系统 Git 的凭据管理。一旦远程仓库(尤其是 GitHub、GitLab 或私有 VCS)的密码、Token 或 SSH 密钥变更,而本地凭据未同步更新,composer install 在拉取 --prefer-source 包或 dev 分支时就会卡住,报错类似:fatal: Authentication failed for 'https://github.com/vendor/package.git' 或 Permission denied (publickey)。
Windows 上删 Windows 凭据管理器里的旧条目
这是最常见也最容易被忽略的环节。Git for Windows 默认使用 Windows Credential Manager 缓存 HTTPS 凭据,改密码或换 Token 后不会自动刷新。
- 打开「控制面板 → 用户账户 → 凭据管理器」→「Windows 凭据」
- 在「普通凭据」列表中找形如
git:https://github.com、git:https://gitlab.example.com的条目 - 点击展开,选「编辑」或「删除」——推荐删掉整条,避免残留旧 Token
- 重新运行
composer install,Git 会弹出新窗口要求输入用户名和密码(或 Token)
⚠️ 注意:如果用的是 GitHub Personal Access Token,请确保 Token 有 repo 权限,并在凭据窗口里把 Token 当作“密码”填进去,用户名仍是你的 GitHub 账号名。
macOS 清空 keychain 中的 git 凭据
macOS 使用 git credential-osxkeychain,手动清除比点界面更可靠。
系统化设计数字化解决方案,涵盖方案类型识别、政策背景分析、需求分析、建设思路设计、架构设计(业务、功能、数据、技术四维度)、技术选型、具体建设内容、实施规划、风险评估和投资估算的全流程能力。适用于规划类、申报类、可研类、投标类和工作汇报类等多种方案产出场景,覆盖政府数字化转型和企业数字化转型两大核心领域。
- 执行命令:
git credential-osxkeychain erase - 然后按两行输入(注意冒号后有空格):
host = github.comprotocol = https - 回车后无提示即成功;若报 command not found,先装:
brew install git(别用 Xcode 自带阉割版) - 再跑
composer install,系统会调起钥匙串,让你新建条目
Linux 或 CI 环境用命令行清理 + 强制重输
Linux 没图形凭据管理器,靠 git config --global credential.helper 配置的 helper(如 cache 或 store)。最稳做法是绕过缓存,直连重输:
- 临时禁用凭据缓存:
git config --global --unset credential.helper - 删掉可能存在的明文凭据文件(如果之前用过
store):rm ~/.git-credentials - 运行
git ls-remote https://github.com/vendor/package.git测试——这步会强制弹出用户名/密码提示 - 输完后,Git 会按当前 helper 设置自动存新凭据;再恢复
git config --global credential.helper cache(可选)
CI 环境(如 GitHub Actions、GitLab CI)通常不配凭据缓存,应直接用 secrets 注入 Token 并设为环境变量:GITHUB_TOKEN,并在 composer.json 的 repository URL 中引用(如 "url": "https://${GITHUB_TOKEN}@github.com/..."),否则每次都会失败。
凭据问题最麻烦的不是解决不了,而是它不报具体错——composer install 可能就停在某个包不动,-vvv 日志里只显示 Cloning into '...' 然后沉默。这时候别猜网络或镜像,先验证 git clone 能不能手动跑通那个 URL。

















