已提交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
相关产品推荐
相关产品推荐

