2012-03-07 15 views
34

bashスクリプトの中で、git URLが有効なgit repoを指していることと、スクリプトがそこから読み取るためのアクセス権を持っていることを確認する最も単純な方法は何でしょうか?リモートgitリポジトリURLの有効性をチェックする方法は?

サポートするプロトコルは、[email protected],https://、およびgit://です。 Curlはgit://プロトコルで失敗します。

[email protected]:UserName/Example.git 
https://[email protected]/UserName/Example.git 
git://github.com/UserName/Example.git 

注:私は、URLが構文的に正しいかどうかを確認するように求めていないよ、私はレポはbashスクリプト内から入力されたURLの場所に存在することを確認する必要があります。

答えて

28

this issueのように、git ls-remoteを使用してアドレスをテストできます。

gitをデバッグする必要がある場合は、set GIT_TRACE=1を呼び出します。例えば:

env GIT_PROXY_COMMAND=myproxy.sh GIT_TRACE=1 git ls-remote https://... 

git ls-remoteは、」私は実際にそれをクローン化することなく、 リモートリポジトリとの通信をテストするために知っている最も簡単な方法です。したがって、これのためのテストとしてのこのユーティリティ が発行されます。

git ls-remote returns 128 on any repo」にアドレスの問題を検出するために使用されています。

28

VonCの答えが正しいですが、ここで私が使用して終了何:

git ls-remoteが、これは、各エントリのコミットIDとともに、HEAD、すべてのブランチやタグで、デフォルトでは、リポジトリに関する情報を返します。 例えば:成功した場合に

$ git ls-remote git://github.com/user/repo.git 
<commit id> HEAD 
<commit id> refs/heads/example_branch 
<commit id> refs/heads/master 
<commit id> refs/tags/v1.0.2 
<commit id> refs/tags/v1.0.0 

git ls-remote戻りコード0、失敗した場合エラーコード128。

リポジトリを表示する権限を持っていない、またはリポジトリがその場所に存在しない場合、git ls-remoteが返された場合のレポは、例えば、到達できない場合:

fatal: The remote end hung up unexpectedly 

使用するにはこのbashスクリプトでは、次のように動作します...

git ls-remote "$SITE_REPO_URL" &>- 
if [ "$?" -ne 0 ]; then 
    echo "[ERROR] Unable to read from '$SITE_REPO_URL'" 
    exit 1; 
fi 

注:&>-沈黙の標準エラー出力と標準出力なので、コマンドは何も出力しません)

+2

非常に良いフィードバック。 +1 – VonC

+3

私は '&> - 'を移植スクリプトに使うことを勧めます。これはbash拡張のようです。他のシェルでは、この構文は期待どおりに機能しません。同様の構文( '>& - 2>& - ')はありますが、機能は同等ではありません。ファイル記述子を静かにリダイレクトするのではなく、多くのプログラムでエラーが発生します。代わりに '>/dev/null 2>&1'を使うことができます。 – nyuszika7h

+0

GIT_ASKPASS = trueを追加して、不正なURLのユーザー名/パスワードの入力を求められないようにしました。 – codeDr

関連する問題