Git:使用'git push'命令将参数发送到'post-receive'钩子

And*_*rea 3 git deployment hook git-push githooks

我已经配置了一个post-receive用于与GIT中自动部署服务器上钩子脚本,如例如描述在这里.

因此,当我在本地PC上发送生产服务器时:

git push production master
Run Code Online (Sandbox Code Playgroud)

post-receive钩被触发,复制存储库的活动目录中的内容.

我的问题是,post-receive当我发送推送时,是否有某种方法将一些参数传递给钩子?

像这样的东西:

git push production master --params="clear-the-cache=1"
Run Code Online (Sandbox Code Playgroud)

然后在钩子内我可以读取'clear-the-cache=1'参数并执行其他操作.

有办法吗?

tor*_*rek 5

编辑:Git版本2.10.0添加了一个新的--push-option(aka -o)参数git push,它提供了一个很好的干净方法来做到这一点. 感谢Steve Coffman提醒我. 服务器和客户端都需要为2.10.0或更高; 然后将提供的选项(每个-o或每个--push-option参数)作为参数传递给预接收和后接收挂钩.


不干净.有一些方法可以提供侧面通道,但我认为它们都非常难看.

考虑每次git push推送一个或多个引用标签.如果每次至少推送两个标签,其中一个标签可以指向携带附加信息的对象(提交,标签等).该附加信息的形式由您决定.

Git通常不允许你推送任意引用空间名称,如refs/sidechannel:

remote: error: refusing to create funny ref 'refs/sidechannel' remotely
 ! [remote rejected] refs/sidechannel -> refs/sidechannel (funny refname)
Run Code Online (Sandbox Code Playgroud)

(虽然我偶然发现github认为这意味着要创建一个名为.奇数的分支refs/sidechannel.)无论如何,这意味着通常,您必须使用分支或标记名称.例如:

git push production master sidechannel
Run Code Online (Sandbox Code Playgroud)

在您的接收后脚本中,您可以检查更新refs/heads/sidechannel并使用它们执行任何操作(包括提取信息,然后删除分支).

或者,您可以在提交消息中使用普通的带注释标签或特殊格式的文本来提供旁道数据.或者,由于refs/notes现在是可识别的名称空间,因此请将其用作旁道的名称.refs/notes/name

  • 如果您使用的是git 2.10或更新版本,您可能会发现[git push-option](http://stackoverflow.com/a/41839473/2904179)有帮助 (2认同)