使用PHP在Git pre-commit Hook中从STDIN读取数据

7
我希望找到一种方法,使git-commit等待标准输入。由于我的bash技能很差,所以我用PHP编写代码,因此我认为可以使用常规的方式。
<?php
$input = trim(fgets(STDIN));
fscanf(STDIN, "%d\n", $line);
?>

我本以为使用exec('mate -w')可以做到这一点,并等待我编写完内容后再继续,但实际上它会继续执行我的PHP脚本。

这个想法是,在我标记一个版本发布之后,git会将HEAD推送到测试web服务器,发送几条推文,然后让我在CHANGELOG中写入版本发布的详细信息。

虽然我可以通过写入文件来实现(使用exec('mate -w')),但我希望它能够暂停,直到我在服务器上进行了快速测试。这样我就可以在注意到任何错误时回滚(我知道这很懒)。

感谢您的任何帮助!


3
尝试使用 exec < /dev/tty,如此回答中所述 https://dev59.com/aHA75IYBdhLWcg3wOGLS#10015707。 - Eliot Sykes
3个回答

4
大多数 git 钩子都会从标准输入中获取一些特殊内容,或者将标准输入与终端分离。它们都设计成非交互式运行,因此我认为钩子不适合你想做的事情。当然,你可以手动与 /dev/tty 进行通信,但我认为这不是一个很好的主意。
我也不认为“pre-commit”钩子适合你的任务,毕竟并不是每次提交都会发布某种类型的内容吧?在测试 Web 服务器机器上使用“post-receive”钩子似乎更合适。

是的,实际上我发现将一些变量保留在.git/config文件中更好,让服务器执行这些相关任务。这更多是我的工作流想法的问题,而不是git本身。谢谢! - Roberto

3

我需要在我的PHP后合并钩子中获取用户输入。

我通过以下代码解决了这个问题:trim(exec('exec < /dev/tty && read input && echo $input'))

不要问为什么,它就是有效的 ;)


请勿询问任何用户输入和命令行相关的内容,这属于编程范畴。 - Martijn

1

Git 2.40(2023年第1季度)确实扩展了run-hooks API,允许在运行钩子脚本时从标准输入中提供数据。

这可以便于在Git pre-commit Hook上从STDIN读取数据,这是不被本地支持的,并且只能在Git 2.40中开始实施(但仅适用于git hook run,尚未进行任何所有钩子的自动执行)。

请查看提交 0414b38, 提交 96af564, 提交 917e080, 提交 5402673 (2023年2月8日) 由Emily Shaffer (nasamuffin)提交。
请查看提交 5123e6e (2023年2月8日) 由Ævar Arnfjörð Bjarmason (avar)提交。
(合并于提交 5048df6,作者为Junio C Hamano -- gitster --,日期为2023年2月22日)

hook:支持--to-stdin=<path>选项

签名作者:Emily Shaffer
签名作者:Ævar Arnfjörð Bjarmason

在“git hook run(man)命令中公开前面提交添加的"path_to_stdin" API。
目前我们不会在测试之外使用此命令接口,但公开此功能使测试钩子API更容易。
计划使用此功能来扩展“sendemail-validate”钩子(threadthread)。

git hook现在包括在其man page中:

'git hook' run [--ignore-missing] [--to-stdin=<path>] <hook-name> [-- <hook-args>]

git hook现在包括在其man page中:

--to-stdin

对于“run”功能,指定一个文件,该文件将被流式传输到挂钩的标准输入。挂钩将从开头到EOF接收整个文件。


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