git clone-資格情報の入力を求める代わりに失敗する


13

自動ツール-Webフロントエンド、CIシステムでgitリポジトリのクローンを作成するとき、時々git cloneの呼び出しにより、ユーザー名とパスワードを要求するプロンプトが開きます(たとえば、存在しないGithubリポジトリをクローンするとき、またはsshキーがない新しいノードでクローンを作成するとき) )。

サーバープロセスがユーザー名とパスワードを与えるのを待つのではなく、gitを単に失敗させる(賢明なエラーメッセージと終了コードを使用することが好ましい)にはどうすればよいですか?


マルチサーバーのJenkinsがセットアップされており、sshキーがない新しいサーバーで実行されると殺されるまでプロンプトを待つのが面倒です-メッセージとゼロ以外の終了コードで失敗するように設定する方法便利である。
ダニーステープル

キャッチオール「バッチ」モードを使用して、ホストキーの入力も許可しない場合は、これが理想的です。
ダニーステープル

これらは両方とも関連している-それらを一緒につなぎしようとしている- serverfault.com/questions/61915/...をstackoverflow.com/questions/7772190/...
ダニーステープル

回答:


14

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のel7サーバーで、https gitクローンを使用してここに戻ることに不満を感じています。他のレポから2.0に更新することがオプションかどうかを確認するために行きます。
ダニーステープル

0

ssh認証を使用していて、Linuxの場合、sshコマンドの置換を作成してこれを無効にすることができます。

「sshnoprompt.sh」という名前のファイルを作成します。

ssh -oBatchMode=yes $@

このファイルを実行可能にする chmod +x sshnoprompt.sh

gitを起動するとき:

GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo

また、インタラクティブなgitプロンプトや質問を許可しません-ユーザーに何かを尋ねることはできません。


0

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
ミチャウゴルニー

-1

gitの実行方法に応じて、stdinまたはstdoutをターミナルに接続しないようにリダイレクトすると、gitが詳細の入力を求めなくなり、エラーが発生します。

これにより、エラー(または少なくともログ)をWebサービスに表示することもできます。


これをどのくらい正確に行うのですか?最初のバッシュでこれを実現しようとすると、両方</dev/nullnohup .. &動作するようには思えません。
ティンTvrtković13年

この答えは、これを達成するための具体的な例がなければ役に立ちません。特に、前述のように「明白な」方法が機能しないこと。
ミチャウゴルニー

@MichałGórny数年前にOPの質問を見たことはありませんでしたが、質問(OS、ツールセット)には十分な情報がありませんでした。stdinおよびstdoutのリダイレクト。Gitはあなたがトップの答えに記載されている環境変数を使用した方がいいでしょうので、質問が聞かれたので、(たとえば、Windows上であなたはAzureのDevOpsチームに接続している場合、それは資格証明書のために外部のダイアログをポップアップする)多くのことを変更しました
マシュー尖塔
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.