2012-12-09 27 views
7

Tôi muốn có kho git có sẵn thông qua "thông minh" HTTP mà chỉ mình tôi có thể đẩy, nhưng bất kỳ ai (hoặc bất kỳ ai có tài khoản) đều có thể sao chép/tìm nạp.Làm cách nào để bật truy cập đọc ẩn danh (kéo) nhưng truy cập ghi được xác thực (đẩy) vào kho lưu trữ git qua http?

Trong git-http-backend(1) manpage ai có thể tìm ra cấu hình ví dụ dưới đây cho máy chủ web Apache:

Đảm bảo mod_cgi, mod_alias, và mod_env được kích hoạt, thiết lập GIT_PROJECT_ROOT (hoặc DocumentRoot) một cách thích hợp, và tạo ra một ScriptAlias ​​đến CGI:

SetEnv GIT_PROJECT_ROOT /var/www/git 
SetEnv GIT_HTTP_EXPORT_ALL 
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ 

Để kích hoạt tính nặc danh đọc truy cập nhưng truy cập đã ghi, cần xin phép với một chỉ thị LocationMatch:

<LocationMatch "^/git/.*/git-receive-pack$"> 
     AuthType Basic 
     AuthName "Git Access" 
     Require group committers 
     #... 
</LocationMatch> 

Rất tiếc, cấu hình này không hoạt động. Tôi có thể lấy/kho nhân bản mà không cần bất kỳ vấn đề, mà không đòi hỏi authenthication, nhưng đẩy thất bại:

$ git push origin master 
error: Cannot access URL http://localhost/git/test.git/, return code 22 
fatal: git-http-push failed 

Kiểm tra error.log của máy chủ web Apache không giúp:

 
[...] Service not enabled: 'receive-pack' 
[...] Request not supported: '/var/www/git/test.git/' 

Các access.log cho chúng ta biết git push đầu tiên sử dụng phương thức GET trên /git/test.git/info/refs?service=git-receive-pack URL dựa trên truy vấn, không được bao gồm trong chỉ thị LocationMatch:

 
[...] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 403 304 "-" "git/1.7.10.4" 
[...] "GET /git/test.git/info/refs HTTP/1.1" 200 267 "-" "git/1.7.10.4" 
[...] "GET /git/test.git/HEAD HTTP/1.1" 200 337 "-" "git/1.7.10.4" 
[...] "PROPFIND /git/test.git/ HTTP/1.1" 404 250 "-" "git/1.7.10.4" 

(các dòng sau đây là về dự phòng để "câm" WebDAV dựa HTTP đẩy - là nó có thể vô hiệu hóa dự phòng này?).


Để bây giờ tôi sử dụng workaround sau: Tôi yêu cầu người dùng hợp lệ cho cả hai lấy và push (sử dụng cấu hình sửa đổi từ "xác thực cho cả đọc và viết" ví dụ trong git-http-backend(1) manpage), và hạn chế push to dùng duy nhất thông qua pre-receivehook bằng cách kiểm tra biến môi trường REMOTE_USER.

+0

Bạn có thể viết (hoặc sử dụng) một cái móc để kiểm tra thông tin (biến môi trường) và từ chối push không mong muốn. Bạn cũng có thể giới hạn mọi thứ theo cách này (Ví dụ: cho phép push "devel", nhưng chỉ một số người dùng "master") –

+0

@Vi .: Tôi biết, đó là những gì tôi làm trong _ _ "fallback" _ solution. .. nhưng giải pháp dự phòng của tôi yêu cầu 'người dùng hợp lệ', vì vậy nó không thực sự được đọc ẩn danh (tìm nạp). –

+0

@ JakubNarębski oh ... giải pháp của tôi cũng yêu cầu 'người dùng hợp lệ', như được định cấu hình hiện tại. Bạn có thể đặt 'REMOTE_USER' thành giá trị giả trong phần truy cập ẩn danh của bạn. Vì '@ all' sẽ được đặt trong cấu hình gitolite, nó sẽ không thành vấn đề. – VonC

Trả lời

1

Một thay thế không phức tạp là sử dụng gitolite ngoài thiết lập Apache-git của bạn.
Bạn có thể cắm gitolite vào Apache dễ dàng (không cần cấu hình ssh).

Xem ví dụ: httpd.conf, kết hợp với địa phương này gitolite installation script.

Sau đó, bạn có thể dễ dàng khai báo đăng nhập Apache cho quyền truy cập Ghi và @all để truy cập đọc.

1

Bạn phải cập nhật hồ sơ của bạn repo .git/config với giá trị sau:

[http] 
    receivepack = true 
+0

Bạn có thể cải thiện câu trả lời bằng cách định dạng tốt hơn. –

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