【问题标题】:Make pre-push hook changes part of pushed content to git server将推送内容的部分预推送挂钩更改为 git 服务器
【发布时间】:2018-10-04 20:23:49
【问题描述】:

我有一个在 git pre-push 挂钩上执行的脚本。里面有修改存储库中项目文件的 PowerShell 脚本。该文件将在本地正确修改,但该更改不会在 git 服务器上结束。

这是一个脚本:

#!C:/Program\ Files/Git/bin/sh.exe
branch=`git rev-parse --abbrev-ref HEAD`

if [ $branch = "development" ]; 
then
    exec powershell.exe -NoProfile -ExecutionPolicy Bypass -File update_version.ps1 -mode dev
pwd
fi

exit 

【问题讨论】:

  • 我相信您有理由在提交挂钩中强制执行此操作,但将逻辑移到构建脚本中可能会更简单。
  • 这应该只在推送时发生。
  • 这毫无意义。 pre-push 钩子可以阻止推送,但不能动态更改现有提交。更改提交的正确方法是预提交挂钩。

标签: git git-bash githooks


【解决方案1】:

作为phd said in a comment,你不能。1原因是git push推送提交,而不是文件。

确实,提交包含个文件——每个提交都是该提交中所有文件的完整快照——所以git push最终会发送文件提交;但这个问题的关键在于git push 在您自己的 Git 存储库中找到了一组提交,而您正在推送的另一个 Git 没有 有这些提交。你的 Git 将这些提交打包——作者和日志消息、先前的提交哈希、源树的快照等等——并发送它们。预推送挂钩旨在测试是否发送这些提交。

您应该(参见脚注 1)编写您的预推送脚本以检查以确保适当的版本信息到位,如果没有,则中止推送。然后,而不是运行git push,运行my-script-that-updates-and-then-runs-git-push。该脚本将根据需要更新和提交,然后运行git push,尽管检查成功,但如果有任何其他适当的操作。


1“不能”是一个强词。您可以,但只能通过我建议避免使用的Rube Goldberg machinery

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2017-02-11
    • 2021-03-21
    • 2020-10-18
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多