6

我有一个 post-receive 钩子,每当我们推送 master 时,它都会部署我们的 master 分支。

我想让部署成为可选;钩子要求简单的 Y/N 响应来实现这一点;bash 伪代码如下:

echo "Should I deploy this code now? Enter Y/N"
read deploy_code

case ${deploy_code} in
  "Y") do_a_deploy ;;
  "N") exit ;;
    *) # ask the question again if not Y or N ;;
esac 

由于 post-receive 钩子在标准输入上获取其参数的方式,该 read 行不会暂停用户输入,并且脚本循环循环试图获得 Y/N 答案。

我认为专门要求 from/dev/tty可以解决这个问题;

read deploy_code < /dev/tty

但这仍然会导致脚本无休止地循环,因为输入不是来自键盘。

在这种情况下是否真的有可能获得键盘输入?

编辑: 啊。看起来这实际上是 ssh 的罪魁祸首。现在查看输出,我添加了 < /dev/tty I'm seen /dev/tty: No such device or address

如果我在本地运行脚本,我可以模仿这一点,但通过 ssh:

ssh 127.0.0.1 "echo 40913e300c8bf4ed7ea91b5ef61a522f3be2c05f e2aabfc865547d8b494b76c96947bab0c62acfec refs/heads/master | /path/to/post-receive"

编辑2:

因此,我可以将 -t 选项设置为 ssh 以根据在 ssh 会话中启用 tty来请求 tty,或者我可以在服务器上的 authorised_keys 文件中基于每个密钥启用它

编辑3:

创建后 ~/bin/ssh -t

#!/bin/sh
ssh -tt "$@"

(双 -t 选项强制一个 tty)并设置 GIT_SSH 指向它,我现在得到可怕的致命:协议错误:坏行长度字符:后跟 005,我猜这是 .bash_profile 或类似的回声之前git有机会运行

4

1 回答 1

2

您也可以解析提交评论。Git 允许空提交。只是另一种选择。

于 2011-10-18T17:19:52.210 回答