origin/master提交泄露至slave/master分支历史,Git推送失败求助
排查Git裸仓库推送失败的问题
我来帮你搞定这个奇怪的推送失败问题!先把能复现问题的脚本整理出来,方便大家一起分析:
# 创建并进入测试目录 mkdir git-test && cd git-test # 初始化两个裸仓库 git init --bare king.git git init --bare slave.git # 克隆king裸仓库到本地工作区,用于提交代码 git clone king.git local-king && cd local-king # 添加slave作为远程仓库 git remote add slave ../slave.git # 创建初始提交 echo "Hello Git" > README.md git add README.md git commit -m "Initial commit" # 尝试推送到slave仓库 git push slave master
当执行最后一步git push slave master时,你应该会看到类似这样的错误提示:
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '../slave.git'
问题原因
这个问题其实是Git版本(2.30及以上)的默认配置变化导致的:
- 对于裸仓库,Git 2.30+将
receive.denyCurrentBranch的默认值从ignore改成了refuse - 刚初始化的裸仓库中,HEAD默认指向
master分支(但该分支实际不存在),Git会误判你在推送远程的"当前分支",从而拒绝推送
解决方案
有几种简单的办法可以解决这个问题:
- 方法1:修改slave仓库的配置
进入slave裸仓库目录,修改Git配置允许推送当前分支:
cd ../slave.git git config receive.denyCurrentBranch ignore
之后回到本地工作区重新推送即可成功:
cd ../local-king git push slave master
- 方法2:推送时显式设置分支(适用于单次推送)
在推送命令中加上--set-upstream(或简写-u),明确关联本地和远程分支:
git push -u slave master
这个命令会同时完成推送和分支关联,后续推送就不用再加参数了。
- 方法3:先在slave仓库创建初始分支(可选)
如果你不想修改配置,也可以先在slave仓库手动创建master分支:
cd ../slave.git git commit --allow-empty -m "Initial empty commit"
之后再回到本地工作区推送,就不会触发分支检查了。
内容的提问来源于stack exchange,提问作者Yurii Hierts
相关产品推荐
相关产品推荐

