You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git远程推送遭拒绝(提交哈希异常)及Post-receive钩子问题求助

解决Git post-receive钩子中git push --mirror被GitHub远程拒绝的问题

看了你的钩子配置和错误日志,这个问题的核心是GitHub上的env-ljmall-staging分支已经有了自有服务器没有的新提交,导致--mirror推送时触发了Git的保护机制——毕竟默认情况下,git push --mirror不会强制覆盖远程存在冲突的分支,怕不小心弄丢别人的代码。

下面一步步帮你解决:

先对齐自有服务器和GitHub的分支状态

首先登录到你的自有Git服务器,找到仓库对应的裸仓库目录(就是存放钩子的那个.git目录),执行以下命令拉取GitHub的最新变更:

cd /path/to/your/repo.git
# 如果还没把GitHub设为远程仓库,先添加
git remote add github git@github.com:honovation/ljmall.git
# 拉取GitHub所有分支、标签的最新状态
git fetch github

这一步会让自有服务器同步GitHub上的最新提交,确保两边的分支哈希匹配,从根源消除冲突。

调整钩子的推送命令

根据你的团队工作流需求,选择以下两种方式之一:

方式1:允许强制覆盖(适合所有代码必须通过自有服务器提交的场景)

如果你们的规则是只能往自有服务器提交代码,禁止直接推送到GitHub,那可以给push --mirror加上--force参数,强制同步所有分支:
修改post-receive钩子内容:

#!/bin/sh
echo "Mirror to GitHub"
# 加入--force参数强制推送
git push --mirror --force >>/tmp/git-push.log 2>&1 &
exec git update-server-info

方式2:更安全的强制推送(推荐)

担心不小心覆盖别人悄悄推到GitHub的代码?用--force-with-lease代替--force——它只会在远程分支的当前状态和你本地已知状态一致时才会执行推送,能有效避免意外覆盖:

#!/bin/sh
echo "Mirror to GitHub"
git push --mirror --force-with-lease >>/tmp/git-push.log 2>&1 &
exec git update-server-info

可选:优化钩子的执行方式

你现在把推送命令放到后台(&),虽然不会阻塞钩子执行,但可能导致推送失败时无法及时发现问题。如果需要确保推送完成再结束钩子,可以去掉&,这样日志会完整记录所有执行细节:

#!/bin/sh
echo "Mirror to GitHub"
git push --mirror --force-with-lease >>/tmp/git-push.log 2>&1
exec git update-server-info

内容的提问来源于stack exchange,提问作者dawncold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:14:33