Как запросить пользователя из ловушки commit-msg?

Я хочу предупредить пользователя, если его сообщение о коммите не ' t следовать определенному набору рекомендаций, а затем дать им возможность редактировать свое сообщение о коммите, игнорировать предупреждение или отменить коммит. Проблема в том, что у меня нет доступа к stdin.

Ниже приведен мой файл commit-msg:

function verify_info {
    if [ -z "$(grep '$2:.*[a-zA-Z]' $1)" ]
    then
        echo >&2 $2 information should not be omitted
        local_editor=`git config --get core.editor`
        if [ -z "${local_editor}" ]
        then
            local_editor=${EDITOR}
        fi
        echo "Do you want to"
        select CHOICE in "edit the commit message" "ignore this warning" "cancel the commit"; do
            case ${CHOICE} in
                i*) echo "Warning ignored"
                    ;;
                e*) ${local_editor} $1
                    verify_info "$1" $2
                    ;;
                *)  echo "CHOICE = ${CHOICE}"
                    exit 1
                    ;;
            esac
        done
    fi
}

verify_info "$1" "Scope"
if [ $# -ne 0 ];
then
    exit $#
fi
verify_info "$1" "Affects"
if [ $# -ne 0 ];
then
    exit $#
fi

exit 0

Вот вывод, когда я оставляю информацию Scope пустой:

Scope information should not be omitted
Do you want to:
1) edit the commit message  3) cancel the commit
2) ignore this warning
#?

Сообщение верное, но это на самом деле не останавливается для ввода. Я также попытался использовать более простую команду «чтение», и у нее та же проблема. Кажется, что проблема в том, что в этот момент git имеет контроль над stdin и предоставляет свой собственный ввод. Как мне это исправить?

Обновление: Возможно, это дубликат этого вопроса , что, к сожалению, говорит о том, что мне не повезло.

69
задан Community 23 May 2017 в 12:18
поделиться

1 ответ

Ловушка commit-msg не запускается в интерактивной среде (как вы заметили).

Единственный способ надежно уведомить пользователя - это записать ошибку в стандартный вывод, поместить копию сообщения фиксации в файл BAD_MSG и дать пользователю указание отредактировать файл и git commit --file = BAD_MSG


Если у вас есть некоторый контроль над средой, у вас может быть альтернативный редактор, который представляет собой сценарий оболочки, который проверяет предложенное сообщение и может перезапустить редактор с дополнительным прокомментированным сообщением.

Обычно вы запускаете редактор и проверяете сохраненный файл на соответствие вашим правилам. и если это не удается, добавьте свое предупреждающее сообщение (с ведущим # ) к файлу и перезапустите редактор.

Вы даже можете разрешить им вставить в сообщение строку # FORCE = true , которая подавит проверку и продолжит работу.

4
ответ дан 24 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: