git pre-receive hook中的用户输入

时间:2014-08-20 13:08:52

标签: git

因此,我不想将ACL放在git预接收挂钩中,而只是想向我的项目中推入主分支(也恰好是我的发布分支)的任何人发送确认消息(y / n)

这样的东西适用于客户端钩子,但我不确定如何在服务器端实现这一点:

while true; do
  read -p "[pre-commit hook] Really want to commit into master? (Y/n) " yn
  if [ "$yn" = "" ]; then
    yn='Y'
  fi  
  case $yn in
      [Yy] ) exit 0; break;;
      [Nn] ) exit 1;; 
      * ) echo "Please answer y or n for yes or no.";;
  esac
done

(此片段取自stackoverflow答案,我稍后将在评论部分中提供的链接)

如何使用预接收服务器端挂钩执行此类操作?

谢谢!

1 个答案:

答案 0 :(得分:2)

作为Zeeker suggested in a comment,您无法在服务器挂钩中执行此操作:它没有返回给用户的输入连接(所述用户可能正在使用ssh通过git ssh:// URL连接,但是ssh并没有以任何方式挂在他或她的键盘上。)

在预接收挂钩的特定情况下,标准输入连接到管道, 1 其写入端连接到产生 oldsha1 newsha1 refname <的命令/ em>元组(每行一个)。更新钩子的标准输入连接到/dev/null(或道德等效,取决于系统)。没有控制终端,因此也无法打开/dev/tty


1 我编写了一个程序,将管道数据复制到临时文件,然后使用来自临时文件的输入运行一个或多个辅助挂钩,其中每个挂钩的搜索偏移重置为0单独的钩子。这允许使用多个钩子,其中任何一个钩子都可以拒绝更新。管道方法很烦人,因为一旦一个钩子消耗了所有输入,它就无法链接到第二个钩子,因为输入全部消失了。