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

如何让Git pre-push钩子的修改同步至Git服务器?

解决Pre-Push钩子中PowerShell修改文件无法同步到Git服务器的问题

你的问题出在两个关键地方:一是脚本修改文件后没有将变更提交到Git本地仓库,二是误用了exec命令导致后续的Git操作根本没执行。下面是具体的分析和修复方案:

问题根源

  1. 未提交修改:Pre-push钩子是在推送前触发,但Git只会推送本地已提交的内容。你的PowerShell脚本修改了文件,但这些变更处于「未暂存/未提交」状态,Git不会自动把它们包含到推送里。
  2. exec命令的坑:你用了exec powershell.exe...,这个命令会直接替换当前的shell进程——也就是说,PowerShell执行完后,整个钩子脚本就结束了,后面的pwd(以及我们需要的Git提交命令)都不会被运行。

修复后的完整脚本

#!C:/Program\ Files/Git/bin/sh.exe
# 用$()替代反引号,更符合现代shell规范
branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$branch" = "development" ]; then
  # 去掉exec,直接运行PowerShell脚本,保留当前shell进程
  powershell.exe -NoProfile -ExecutionPolicy Bypass -File update_version.ps1 -mode dev
  
  # 检查PowerShell脚本是否执行成功
  if [ $? -eq 0 ]; then
    # 仅暂存版本文件的修改(替换成你实际的文件路径,比git add .更安全)
    git add ./path/to/your/version-file.ext
    # 创建自动提交,建议加上清晰的提交信息
    git commit -m "Auto-update version via pre-push hook (development branch)"
    echo "✅ Version updated and committed automatically."
  else
    echo "❌ Error: update_version.ps1 failed to run. Push aborted."
    exit 1  # 退出码非0会终止推送,提醒用户排查问题
  fi
fi
exit 0

关键优化点

  • 移除exec:让PowerShell在子进程中运行,钩子脚本可以继续执行后续的Git命令。
  • 明确暂存文件:用具体的文件路径替代git add .,避免意外暂存其他无关的本地修改。
  • 添加错误检查:通过$?判断PowerShell脚本的执行结果,如果失败就终止推送,防止错误的版本被推送。
  • 安全的分支判断:给$branch加上双引号,避免分支名包含特殊字符时出现语法错误。

额外建议

如果担心自动提交会和你未完成的本地修改冲突,可以在脚本开头添加检查:

# 检查是否有未提交的本地修改
if ! git diff --quiet; then
  echo "⚠️ Warning: You have uncommitted changes. Version update skipped."
  exit 0  # 跳过版本更新,继续推送原有提交
fi

这样当你有未提交的工作时,钩子会跳过版本更新,避免自动提交打乱你的工作流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:50