2012-03-07 35 views
34

Trong tập lệnh bash, cách đơn giản nhất để xác minh rằng URL git trỏ đến một repo git hợp lệ và tập lệnh có quyền truy cập để đọc từ nó?Cách kiểm tra tính hợp lệ của URL kho git từ xa?

Các giao thức cần được hỗ trợ là [email protected], https://git://. Curl bị lỗi trên giao thức git://.

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

Lưu ý: Tôi không yêu cầu kiểm tra xem URL có đúng cú pháp hay không, tôi cần xác minh rằng repo tồn tại tại vị trí URL được nhập từ bên trong tập lệnh bash.

Trả lời

28

Như đã thấy trong this issue, bạn có thể sử dụng git ls-remote để kiểm tra địa chỉ của mình.

Nếu bạn cần gỡ lỗi các cuộc gọi git set GIT_TRACE=1. ví dụ:

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

"git ls-remote" là cách nhanh nhất mà tôi biết để kiểm tra thông tin liên lạc với một kho lưu trữ từ xa mà không thực sự sao chép nó. Do đó tiện ích của nó như là một thử nghiệm cho vấn đề này .

Bạn có thể thấy nó được sử dụng để phát hiện sự cố địa chỉ trong "git ls-remote returns 128 on any repo".

28

Mặc dù câu trả lời VonC là đúng, đây là những gì tôi đã kết thúc bằng:

git ls-remote sẽ trở lại thông tin về một kho lưu trữ, theo mặc định này là HEAD, tất cả các chi nhánh và các thẻ, cùng với cam kết ID cho mỗi mục. ví dụ .:

$ 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 lợi nhuận mã 0 trên thành công, mã lỗi 128 trên thất bại.

Nếu repo là unreachable, ví dụ, nếu bạn không có quyền để xem các kho lưu trữ, hoặc nếu một kho lưu trữ không tồn tại ở vị trí đó, git ls-remote sẽ trở lại:

fatal: The remote end hung up unexpectedly 

Để sử dụng này trong một kịch bản bash, sau đây sẽ làm việc ...

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

(Lưu ý: các &>- im lặng stderr và stdout, do đó lệnh sẽ không ra bất cứ điều gì)

+2

Phản hồi rất tốt. +1 – VonC

+3

Tôi khuyên bạn không nên sử dụng '&> -' cho các tập lệnh di động, vì nó dường như là phần mở rộng bash. Trong các shell khác, cú pháp này sẽ không hoạt động như mong đợi. Mặc dù có một cú pháp tương tự ('> & - 2> & -'), nhưng chức năng không tương đương - nó sẽ đóng các mô tả tập tin thay vì âm thầm chuyển hướng chúng, gây ra lỗi trong nhiều chương trình. Thay vào đó, bạn có thể sử dụng '>/dev/null 2> & 1'. – nyuszika7h

+0

Tôi đã thêm GIT_ASKPASS = true để tránh bị nhắc nhập Tên người dùng/mật khẩu trên url xấu. – codeDr

Các vấn đề liên quan