我已经在服务器上配置了一个 post-receive
Hook 脚本,以便使用 Git 进行自动部署,如示例中所述 here .
因此,当我在本地 PC 上向生产服务器发送推送时:
git push production master
post-receive
Hook 被触发,将存储库的内容复制到 live 目录中。
我的问题是,当我发送推送时,是否有一些方法可以将一些参数传递给 post-receive
Hook ?
像这样:
git push production master --params="clear-the-cache=1"
然后在 Hook 中我可以读取 'clear-the-cache=1'
参数并执行其他操作。
有办法吗?
最佳答案
编辑:Git 版本 2.10.0 添加了一个新的 --push-option
(又名 -o
) git push
的参数,它提供了一种非常干净的方法来执行此操作。 Thanks to Steve Coffman for reminding me.服务器和客户端都需要在 2.10.0 或更高版本;提供的选项,每一个 -o
或 --push-option
参数,然后作为参数传递给预接收和后接收 Hook 。
不干净。有一些方法可以提供侧 channel ,但我认为它们都很丑陋。
考虑每个 git push
压入一个或多个引用标签。如果您每次至少推送两个标签,其中一个标签可以指向携带附加信息的对象(提交、标签等)。附加信息的形式由您决定。
Git 通常不允许您推送任意引用空间名称,例如 refs/sidechannel
:
remote: error: refusing to create funny ref 'refs/sidechannel' remotely
! [remote rejected] refs/sidechannel -> refs/sidechannel (funny refname)
(虽然我无意中发现 github 认为这意味着创建一个名为 refs/sidechannel
的分支。奇怪。)无论如何,这意味着通常,您必须使用分支或标签名称.例如:
git push production master sidechannel
在您的接收后脚本中,您可以检查 refs/heads/sidechannel
的更新并随心所欲地处理它们(包括提取信息,然后删除分支)。
或者,您可以在提交消息中使用普通的注释标签或特殊格式的文本来提供边信道数据。或者,自 refs/notes
现在是公认的 namespace ,请使用 refs/notes/<em>name</em>
作为侧 channel 的名称。
关于Git:用 'post-receive'命令发送参数到 'git push' hook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37360442/