Git:使用“git push”命令向“post-receive”钩子发送参数

7
我已经在服务器上配置了一个 post-receive 挂钩脚本,用于使用Git进行自动部署,例如在此处描述。

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

git push production master

当触发post-receive钩子时,会将存储库的内容复制到实时目录中。

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

类似于以下内容:

git push production master --params="clear-the-cache=1"

那么在钩子内部,我可以读取'clear-the-cache=1'参数并执行其他操作。

有没有一种方法可以实现呢?


1
一个 post-receive 钩子本身不带任何参数。也许你可以从某个配置文件中读取 clear-the-cache=1,而该配置文件已添加到存储库中。 - ElpieKay
可能是Can I send out of band data along with a commit?的重复问题。 - SteveCoffman
1个回答

7
编辑:Git版本2.10.0增加了一个新的--push-option(又称为-o)参数,用于执行git push,这提供了一种很好的清晰方法。 感谢Steve Coffman提醒我。 服务器和客户端都需要使用2.10.0或更高版本;提供的选项(每个-o--push-option参数一个)将被作为参数传递到pre-receive和post-receive钩子中。
并不干净。有一些方法可以提供侧通道,但我认为它们都非常丑陋。
考虑到每次git push都会推送一个或多个参考标签。如果每次至少推送两个标签,则其中一个标签可以指向携带其他信息的对象(提交、标记等)。该附加信息的形式取决于您。
Git通常不允许您推送任意ref-space名称,例如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

在您的 post-receive 脚本中,您可以检查 refs/heads/sidechannel 的更新情况,并对其采取任何您喜欢的操作(包括提取信息,然后删除分支)。
或者,您可以使用普通的批注标签或特殊格式的提交消息文本来提供侧信道数据。或者,由于 refs/notes 现在是一个被认可的名称空间,您可以使用 refs/notes/name 作为侧通道的名称。

对我来说,设置这个似乎相当复杂,但我会尝试你的解决方案。谢谢。 - Andrea
1
你可能会考虑ElpieKay的建议,这可能更简单。例如,可以将名为.params的文件隐藏起来,以免常规查看。我不确定是否有任何好的解决方案;所有这些都是带有不同权衡的糟糕解决方案。 :-) - torek
2
如果您使用的是Git 2.10或更新版本,您可能会发现git push-option很有用。 - SteveCoffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接