自動ツール-Webフロントエンド、CIシステムでgitリポジトリのクローンを作成するとき、時々git cloneの呼び出しにより、ユーザー名とパスワードを要求するプロンプトが開きます(たとえば、存在しないGithubリポジトリをクローンするとき、またはsshキーがない新しいノードでクローンを作成するとき) )。
サーバープロセスがユーザー名とパスワードを与えるのを待つのではなく、gitを単に失敗させる(賢明なエラーメッセージと終了コードを使用することが好ましい)にはどうすればよいですか?
自動ツール-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バージョン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
そもそもプログラムを参照する必要さえありません。-c core.askPass
コードが資格情報の処理をオフロードするプログラムを認識しないため、リポジトリがプライベートである場合、後続の入力なしでgit構成を渡すだけで失敗が発生します。これは確かにここで言及した他の方法よりも古くて単純な方法ですが、古いバージョンのgitでも同じ効果があるかどうかはわかりません。
$echo
は、(設定されていない)変数参照が空の文字列に展開されるため、まったく意味がありません。echo
そこに(ドル記号なしで)入れると、リポジトリの場所として解釈されるため、これも正しくありません。それに違いない-c core.askPass=echo
。
gitの実行方法に応じて、stdinまたはstdoutをターミナルに接続しないようにリダイレクトすると、gitが詳細の入力を求めなくなり、エラーが発生します。
これにより、エラー(または少なくともログ)をWebサービスに表示することもできます。
</dev/null
とnohup .. &
動作するようには思えません。