commit-msg フックの中からユーザーにプロンプトを出すにはどうすればよいですか?
2023-09-15 16:24:08
質問
私は、コミットメッセージが特定のガイドラインのセットに従っていない場合にユーザーに警告し、その後、コミットメッセージを編集するか、警告を無視するか、またはコミットをキャンセルするかのオプションを与えたいと思います。問題は、私が標準入力にアクセスできないようであることです。
以下は私の 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
#?
メッセージは正しいのですが、実際に入力のために停止することはありません。もっと単純な "read" コマンドも使ってみましたが、同じ問題がありました。どうやら、この時点で git が標準入力を制御して、自分自身の入力を提供していることが問題のようです。どうすればこれを修正できますか?
更新: どうやらこれは この質問 と重複している可能性があり、残念ながら私は運が悪いと思われます。
どのように解決するのですか?
呼び出し
exec < /dev/tty
を呼び出すと、標準入力がキーボードに割り当てられます。コミット後の git フックで動作します。
#!/bin/sh
echo "[post-commit hook] Commit done!"
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
while true; do
read -p "[post-commit hook] Check for outdated gems? (Y/n) " yn
if [ "$yn" = "" ]; then
yn='Y'
fi
case $yn in
[Yy] ) bundle outdated --pre; break;;
[Nn] ) exit;;
* ) echo "Please answer y or n for yes or no.";;
esac
done
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] 既存の、プッシュされていないコミットメッセージを修正するには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] コミットに含まれるすべてのファイルを一覧表示するにはどうすればよいですか?
-
[解決済み] git に自分の好きなエディタを使わせてコミットするにはどうしたらいいですか?
-
[解決済み] ある特定のコミットのコミット作者を変更する方法は?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決策 このリポジトリでは、別の git プロセスが実行されているようです。たとえば、「git commit」によって開かれたエディタなどです。
-
git push issues
-
[解決済み] gitにもsvnのような無視コマンドはありますか?
-
[解決済み] 新サーバーへのGitプッシュ/クローン
-
[解決済み] なぜgit AuthorDateはCommitDateと違うのですか?
-
[解決済み] ローカルのGitブランチをリモートレポにコピーする方法
-
[解決済み] ローカルレポとリモートレポを接続する
-
[解決済み] どのブランチとマージしたいかを言わずにpullするように言われました。
-
[解決済み] ファイル変更時のDockerコンテナの再構築
-
[解決済み] ループ内でユーザー入力を読み取る