git - 如何从 `commit-msg` git hook 中打开终端编辑器

标签 git bash githooks

我有一个commit-msg 钩子(Hook)来验证提交消息的内容。

如果检查失败,我想在我的终端编辑器中重新打开提交消息文件,以便我可以更正错误。

我有以下内容,当验证失败时提示用户。

#!/usr/bin/env bash

COMMIT_MSG_FILE="$1"

# If we have a STDIN, use it, otherwise get one
if tty >/dev/null 2>&1; then
  TTY=$(tty)
else
  TTY=/dev/tty
fi

while true; do

  # read lines from file
  COMMIT_MSG_LINES=()
  while IFS= read -r; do
    COMMIT_MSG_LINES+=("$REPLY")
  done < <(cat $COMMIT_MSG_FILE)

  # validate - limit the subject to 50 characters
  test "${#COMMIT_MSG_LINES[0]}" -le 50 && break;

  echo -n "Validation failed. Proceed with commit [y/n]? "
  read REPLY < "$TTY"

  case "$REPLY" in
    Y*|y*) exit 0 ;;
    N*|n*) exit 1 ;;
    *)     $EDITOR $COMMIT_MSG_FILE; continue ;;
  esac

done

YyNn 之外的任何响应都应重新打开编辑器。

但是,我收到以下错误:

Received SIGHUP or SIGTERM

当我手动调用 Hook 时,脚本可以正常工作,所以我认为这与调用 Hook 的上下文有关。

如何让编辑器从这样的 commit-msg Hook 中打开?

最佳答案

解决了。将 TTY 显式重定向到 $EDITOR 似乎可行。

替换:

$EDITOR $COMMIT_MSG_FILE

与:

$EDITOR $COMMIT_MSG_FILE < "$TTY"

关于git - 如何从 `commit-msg` git hook 中打开终端编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39040410/

相关文章:

git - 如何注销一个Github账户并使用另一个账户?

git - 如何允许删除gitolite的远程分支并禁止非快进

bash - 将特殊字符回显到 bash 中的文件

git - $GIT_DIR 不再设置在预提交 Hook 中

git - 将更改推送到原点(上游)后如何将更改推送到另一个 Remote ?

bash - Git post-receive hook,将 curl 提交消息发送到 Discord Webhook

Git stash then checkout 每次

git - git中软重置和修改提交之间的区别

bash - 当文件系统跟不上 bash 重定向的输出时会发生什么?

linux - 启动命令,在 10 秒后计算输出行数,然后重新启动它或让它运行