Git receive.denyCurrentBranch=updateInstead不更新工作区问题求助
Git推送至当前分支后工作区未更新问题排查
问题现象
- 服务器仓库配置
receive.denyCurrentBranch=updateInstead后,不符合预期行为:工作区仅含未跟踪文件(属干净状态)时,推送被允许但工作区未自动硬重置,需手动执行git checkout -f;若工作区不干净,推送未被拒绝。 - 曾出现
push-to-checkout钩子未触发情况(已解决):钩子文件.git/hooks/push-to-checkout存在且具备+x权限,设置输出内容并以1码退出本应中止推送,但推送仍成功;update钩子可正常运行。 - 当前
push-to-checkout已触发,但工作区未同步至索引状态。 - 环境:客户端为2.31.0.windows.1(TortoiseGit),服务器为2.39.1,SSH连接。
排查与解决步骤
1. 确认核心配置有效性
在服务器仓库执行命令,确保配置正确生效:
git config --local receive.denyCurrentBranch updateInstead
验证配置输出:
git config --local receive.denyCurrentBranch
需确保输出为updateInstead。
2. 修正push-to-checkout钩子逻辑
自定义push-to-checkout钩子会覆盖Git默认的工作区重置逻辑,需手动添加工作区同步代码:
- 编辑
.git/hooks/push-to-checkout,添加核心重置逻辑(bash示例):
#!/bin/bash # 重置工作区至当前分支HEAD,匹配索引状态 git checkout -f HEAD # 检查工作区是否存在已跟踪文件未提交修改 if git diff --no-ext-diff --quiet --exit-code; then exit 0 # 工作区干净,允许推送 else exit 1 # 工作区有修改,拒绝推送 fi
- 确保钩子权限正确:
chmod +x .git/hooks/push-to-checkout
3. 验证工作区干净状态判定
Git将“无已跟踪文件修改”视为工作区干净,未跟踪文件不影响。在服务器仓库执行:
git status
若输出含nothing to commit, working tree clean,则符合干净条件。
4. 排除版本与客户端因素
- 在服务器端模拟推送,排除客户端问题:
git push . <本地分支名>:<远程分支名>
观察工作区是否自动更新。
- 检查TortoiseGit推送设置,确认未启用特殊限制选项。
5. 钩子路径与权限二次校验
确保钩子文件位于仓库的.git/hooks/目录下,脚本开头的shebang(如#!/bin/bash)与服务器环境匹配,避免因脚本无法执行导致逻辑失效。
内容的提问来源于stack exchange,提问作者Sinus tentaclemonster
相关产品推荐
相关产品推荐

