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

已提交Git文件无法推送到目标仓库问题排查求助

Git推送显示「Everything up-to-date」但文件未同步到目标仓库的排查方案

核心矛盾梳理

你已经通过git ls-tree -r --name-only master确认本地master分支提交完整,推送时提示Everything up-to-date,但目标仓库的文件并未更新;排查后发现post-receive钩子完全未执行——添加了日志监控但无输出,权限为0751符合要求,甚至重建裸仓库、重新关联远程仓库后问题依旧。

按优先级排查以下要点

1. 确认推送分支映射是否正确

  • 不要依赖$destination_git_branch和$source_git_branch变量,直接用完整命令测试:git push -v <远程名> master:<目标分支名>,查看详细输出里的分支映射是否匹配预期,比如是否误将本地master推送到了production分支而非staging?
  • 执行git remote show <远程名>,查看本地分支与远程分支的关联关系,确认之前的错误关联是否已清理干净。

2. 简化钩子做基础有效性测试

  • 备份现有post-receive钩子,替换为极简测试代码:
    #!/bin/sh
    echo "钩子触发时间: $(date)" >> /tmp/git_hook_debug.log
    
    推送后查看服务器上的/tmp/git_hook_debug.log是否有内容。如果仍然没有,说明钩子根本未被Git调用,问题不在钩子逻辑本身,而是钩子未被触发。
  • 确认钩子文件的位置与名称:必须放在裸仓库的hooks/目录下,文件名只能是post-receive(不能加.sh后缀),且该裸仓库必须是当前推送指向的远程仓库(避免重建仓库后本地远程仍指向旧路径)。

3. 检查裸仓库与工作目录的配置

  • 你的钩子应该是要将裸仓库内容同步到实际部署目录(如staging目录),检查钩子中的--work-tree参数路径是否正确,或查看裸仓库config的core.worktree配置:
    执行git config --file <裸仓库路径>/config core.worktree,确认输出路径是否为目标staging目录,之前的--git-dir错误可能残留了错误配置。
  • 确保部署目录权限:执行钩子的用户(通常为git用户)必须对该目录拥有读写权限,可通过chown -R git:git <部署目录>修正权限。

4. 查看服务器端Git日志

  • 登录服务器,查看裸仓库内的logs/refs/heads/<目标分支>文件,确认最近的推送记录是否存在——若有记录,说明推送已到达服务器,问题出在钩子同步环节;若无记录,说明推送未到达服务器,是本地远程配置问题。
  • 检查服务器系统日志(如/var/log/auth.log或/var/log/syslog),查找Git相关错误信息,比如钩子执行时的权限问题或命令报错。

5. 排查钩子执行环境问题

  • 钩子执行时的环境变量与手动登录服务器时不同,比如PATH可能未包含Git命令路径,导致钩子内的Git命令执行失败。可在钩子开头添加env >> /tmp/git_env.log,推送后查看环境变量中的PATH、HOME是否正确。
  • 检查服务器Git版本,若与本地版本差异过大,部分命令可能不兼容,比如旧版本Git不支持某些钩子参数。

内容的提问来源于stack exchange,提问作者B-zaro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:05:22