git "ping":リモートリポジトリが存在するかどうかを確認します


76

リモートリポジトリが存在するかどうかを知りたいのですが。ここに私が思いついたものがあります:

git ls-remote -h "$REPO_URL" &> /dev/null

より良い方法はありますか?


4
良い選択のようです。refのリストを取得してフォーマットする(その後に送信される/dev/null)「余分な作業」のオーバーヘッドは、かなり小さいはずです。
クリスジョンセン

答えは次のとおりです。いいえ、良い方法はありません。
ティモ

回答:


70

git ls-remoteコマンドはその目的のために作られていると思います。


うん、これは動作しているようですが、私はそのレポのクローンを作成することができ、この100%があれば、あなたは、いくつかの説明を提供して教えてくださいすることができます
vladkras

15

--exit-code引数を使用する場合、への出力の送信をスキップできますnull。エラーの場合にのみ何かを返します。

また、-h引数を使用して、ヘッド参照のみを表示できます。

git ls-remote --exit-code -h "$REPO_URL"

-h素晴らしいアイデアです。ただし、--exit-codeここでは正しい選択ではありません。マニュアルページには、リモートリポジトリに一致する参照が見つからない場合、ステータス「2」で終了します。これは、でgit ls-remote --exit-code "$REPO_URL"初期化されたばかりの空のレポでは失敗することを意味しgit initます。
ジョリス

3

次のようなものを使用して出力を絞り込むことができます git ls-remote "$REPO_URL" HEAD


それは永遠にハングします。
ティモ

1
@Timoの場合、おそらく応答のないサーバーまたは接続、または壊れたgitクライアントがあります。たとえば、ネットワークポートはフィルタリングされます。さらなる調査は、pingが応答しない場合に起こることと似ています:)。たとえば、netcatまたはopenssl s_clientまたはtracepathを介して接続が確立されたかどうかを確認できます。
18

0

TL; DR:

git ls-remote 方法です、ここに迅速なアクセスのためのシェル対応関数があります:

  ## Returns errlvl 0 if $1 is a reachable git remote url 
  git-remote-url-reachable() {
      git ls-remote "$1" CHECK_GIT_REMOTE_URL_REACHABILITY >/dev/null 2>&1
  }

使用法:

if git-remote-url-reachable "$url"; then
   ## code
fi

何してるの?

これは、以前に述べられたすべてのコメント/ソリューションの便利なマッシュアップであり、いくつかの小さな調整、バッシュコピーペーストの準備ができた関数、使用法のコードサンプルが非常に明確になっています。次のことに注意してください。

  • チェックされた参照はおそらく存在しないため、出力が制限されます。これは、git 一致しないrefでエラーレベル0で終了するためです。ここでの唯一の違いは、ネットワークに転送する出力が要求する場合と比べてわずかに少ないことですHEAD(refを要求しないか、ヘッドのみに制限するよりもはるかに少ない)。また、これはキャストする出力も少なくなります/dev/null(ただし、とにかく最後の1つは取るに足らない時間です)

  • refをチェックすると、存在を調査していることが明確になります。これは、調査しているサーバーの管理者に礼儀正しくなりたい場合に役立ち、何かを監視している場合にこれらのプローブを受信する理由を理解する機会を与えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.