不支持。git remote set-url 只能设置一个 push 地址;需用 git config --add remote.<name>.pushurl 添加多个 pushurl,Git 会依次推送;推荐用 shell 别名或脚本显式控制多端推送以提升可维护性与安全性。

git remote set-url 支持多个 push URL 吗?
不支持。git remote set-url 只能设置一个 push 地址,覆盖原有值。想推送到多个远程仓库,必须用 Git 的「推送镜像」机制——即给同一个 remote 配置多个 pushurl,而不是改 url。
怎么给一个 remote 添加多个 push 地址?
用 git config 手动追加多个 pushurl,Git 会依次尝试推送(失败不中断后续):
- 先确保 remote 存在:
git remote add origin https://github.com/user/repo.git - 添加第二个推送地址:
git config --add remote.origin.pushurl https://gitlab.com/user/repo.git - 再加第三个(可选):
git config --add remote.origin.pushurl ssh://git@bitbucket.org/user/repo.git
执行后,git config -l | grep 'remote.origin.pushurl' 能看到多行输出。注意:url 字段仍只有一条(用于 fetch),而所有 pushurl 仅用于 push。
git push origin main 会真的推到全部地址吗?
会,但有前提和风险:
- 所有
pushurl必须可写(权限、网络、认证都得通),任一失败会报错,但 Git 默认继续尝试下一个 - 如果某个远端已有同名分支且不是 fast-forward(比如别人先推了),该地址推送失败,但不影响其他地址成功
- SSH 密钥、HTTPS token、2FA 等认证方式需各自兼容——比如 GitHub 用 token,GitLab 用 SSH,就得确保环境里两者都能用
- 别在共享仓库或 CI 环境里盲目配多个
pushurl,容易误推敏感分支
有没有更安全的替代方案?
有,推荐用 shell 别名或脚本封装,显式控制每个推送动作:
- 定义别名:
git config --global alias.pushall '!f() { git push origin "$1" && git push gitlab "$1" && git push bb "$1"; }; f' - 然后用:
git pushall main—— 每个命令独立执行,失败立刻停,便于定位问题 - 或者写个简单脚本
git-push-multiple放进$PATH,对每个 remote 做git push <remote> <refspec>并捕获退出码
这种做法不依赖 Git 内部的多 pushurl 行为,调试起来直接,也避免了 pushurl 顺序不可控、错误信息混杂的问题。
真正麻烦的不是加地址,而是不同远端的权限模型、分支保护规则、CI 触发逻辑都不一样——同一推送在 GitHub 成功,在 GitLab 却被 pre-receive hook 拒绝,这种细节最容易漏掉。


















