自動化ツール-Webフロントエンド、CIシステムでgitリポジトリのクローンを作成すると、git cloneの呼び出しで、ユーザー名とパスワードを要求するプロンプトが表示される場合があります(たとえば、存在しないGithubリポジトリのクローンを作成する場合や、新しいノードでsshキーが不足している場合) )。
サーバープロセスがユーザー名とパスワードを提供するのを待つのではなく、どうすればgitを(できれば賢明なエラーメッセージと終了コードで)失敗させるだけですか?
Gitバージョン2.3には、環境変数GIT_TERMINAL_Prompt
があり、0
に設定すると、資格情報のプロンプトが無効になります。
詳細については、man git
(gitバージョン2.3
に更新した後)または githubのこのブログ投稿 を参照してください。
例:
git clone https://github.com/some/non-existing-repo
はユーザー名とパスワードの入力を求めますGIT_TERMINAL_Prompt=0 git clone https://github.com/some/non-existing-repo
は、ユーザー名とパスワードを要求せずに失敗しますGitの実行方法に応じて、端末に接続されないようにstdinまたはstdoutをリダイレクトすると、gitが詳細を求めるプロンプトを表示せず、エラーが発生します。
これにより、エラー(または少なくともログ)をWebサービスに表示することもできます。
Gitバージョン1.8.3.1からの作業。
git clone -c core.askPass $echo url/or/path/to/git/repo
構成 core.askPass
は、資格情報の処理の制御を前述のプログラムに渡すことで機能します。ただし、$echo
は出力以外には何もできないため、クローンの試行はすぐに失敗し、それぞれのbashリダイレクトが適用されます。このコードは、gitリポジトリがたまたまプライベートである場合にのみ呼び出され、特定のリポジトリの認証が失敗したことを示すエラー出力をパイプします。これは、知っているプライベートリポジトリに対してhttps://github.com/git/git
パブリックリポジトリに対してテストできます。
取り引きを甘くするために、最初にecho
のようなプログラムを参照する必要さえありません。次の入力なしでgit configuration -c core.askPass
を渡すだけでは、コードが資格情報の処理をオフロードするプログラムを知らないため、リポジトリがプライベートになっている場合でもエラーが発生します。これは確かにここで述べた他のものより古くて単純な方法ですが、古いバージョンのgitで同じ効果があるかどうかはわかりません。
Linuxでssh認証を使用している場合は、sshコマンドの代替を作成して、これを無効にすることができます。
「sshnoprompt.sh」というファイルを次のように作成します。
ssh -oBatchMode=yes $@
このファイルをchmod +x sshnoprompt.sh
で実行可能にします
次にgitを起動すると:
GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo
また、対話型のgitプロンプトや質問は許可されません。ユーザーに何かを尋ねることはできません。