2012-02-14 27 views
6

Tôi đang triển khai một tùy chọn trong ứng dụng của mình để sử dụng --depth 1 để tạo bản sao chức năng tối thiểu của một repo git, và tôi vừa nhận ra rằng vận chuyển http câm không hỗ trợ --depth. Tôi muốn tự động phát hiện xem một điều khiển từ xa là câm hay thông minh, vì vậy tôi có thể bỏ qua tùy chọn --depth khi nói chuyện với http repos câm. Điều này có thể không?Có thể phát hiện xem từ xa git http có thông minh hay câm không?

Cách khác, có cách trực tiếp để kiểm tra xem từ xa git có hỗ trợ --depth không?

+0

Tôi muốn sử dụng gõ vịt: giả sử đó là một con vịt và ném nó vào ao, nếu đó là một con mèo, hãy yêu cầu anh ta xin lỗi (và có thể tránh vứt nó vào ao). – redShadow

Trả lời

5

Một cách là do truy vấn HTTP trực tiếp.

Máy khách git hỗ trợ thông minh thêm đối số vào cuối URL đầu tiên được thu thập, "[repo]/info/refs? Service = git-upload-pack". Máy chủ câm sẽ chỉ gửi tệp "info/refs" dưới dạng văn bản bỏ qua đối số, trong khi máy chủ thông minh sẽ trả về một số dữ liệu nhị phân trước danh sách refs, bao gồm văn bản "service = git-upload-pack" và danh sách các tính năng (bạn có thể tìm ra hỗ trợ "chiều sâu").

Bạn có thể viết thử nghiệm thông minh/câm này bằng cách sử dụng wget hoặc curl để kiểm tra loại MIME: text/plain (câm) so với ứng dụng/x-git-upload-pack-advertising (thông minh).

$ curl -si http://github.com/git/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type' 
Content-Type: application/x-git-upload-pack-advertisement 
$ curl -si http://git.kernel.org/pub/scm/git/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type' 
Content-Type: application/x-git-upload-pack-advertisement 
$ curl -si http://repo.or.cz/r/git.git/info/refs?service=git-upload-pack | grep --binary-files=text '^Content-Type' 
Content-Type: text/plain 

(Pipe để grep -q "^Content-Type: application/x-git" và sử dụng mã để đổi lấy thực nghiệm/sai.)

+0

Bạn cũng có thể sử dụng GIT_CURL_VERBOSE = 1 GIT_TRACE = 1 git clone --verbose --depth 1 repo_url để sử dụng trình khách git gốc thay vì curl (cũng xử lý xác thực trong trường hợp kho lưu trữ riêng) – kontulai

6

Tôi tin rằng kể từ git 1.8.2, bạn có thể kiểm tra Content-Type tiêu đề.
Đó là lý do tại sao commit git/git/4656bf47 đề cập:

Trước khi phân tích một nghi ngờ thông minh-HTTP phản ứng xác minh trở Content-Type phù hợp với tiêu chuẩn. Điều này bảo vệ một máy khách khỏi cố gắng xử lý một tải trọng có mùi giống như một phản ứng máy chủ thông minh-HTTP.

Bạn có thể xem ví dụ về thiết lập trường rằng trong phạm sitaramc/gitolite/32d14d39:

my $service = ($ENV{SSH_ORIGINAL_COMMAND} =~ /git-receive-pack/ ? 'git-receive-pack' : 'git-upload-pack'); 

if ($service) { 
    print "Content-Type: application/x-$service-advertisement\r\n"; 
} 

Vì vậy, một lĩnh vực Content-Type tiêu đề với x-git-receive-pack-advertisement hoặc x-git-upload-pack-advertisement nghĩa thông minh http.

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