2012-03-07 191 views
34

在一個bash腳本中,驗證一個git URL指向一個有效的git倉庫並且腳本有權讀取它的最簡單方法是什麼?如何檢查遠程git存儲庫URL的有效性?

應該支持的協議是[email protected],https://git://。捲曲在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將返回有關存儲庫,缺省是HEAD,所有的分支和標籤,每個條目一個提交ID一起。 例如爲:

$ 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 2012-03-08 19:06:24

+3

我建議不要使用'&gt; - '作爲可移植的腳本,因爲它看起來是bash擴展。在其他shell中,此語法不能按預期工作。儘管有類似的語法('>& - 2>& - '),但功能並不相同 - 它會關閉文件描述符而不是靜默重定向它們,這會導致許多程序出錯。您可以使用'>/dev/null 2>&1'來代替。 – nyuszika7h 2013-10-27 15:34:08

+0

我添加了GIT_ASKPASS = true,以防止在錯誤的URL上收到提示輸入用戶名/密碼。 – codeDr 2015-08-04 21:44:39