나는 이것을 가지고있다
location ~ ^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-upload-pack)${
//send to fastcgi_param SCRIPT_FILENAME /usr/bin/gitolite-shell;
}
이것은 클론에서 작동합니다. 키나 http 사용자/비밀번호 없이 공개 저장소를 만들 수 있도록 Gitolite를 수정했습니다.
이제 정보/참조를 푸시하려고 하면 이 경로와 일치하며 푸시를 담당하는 다음 위치로 이동할 수 없습니다.
location ~ ^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-receive-pack)${
//some custom auth and so on
}
Btw, 이것은 공개 저장소에 대한 푸시를 위해 Apache에서 작동합니다.
<LocationMatch "^/username/repo/git-receive-pack$">
</LocationMatch>
결론은 다음과 같습니다.
^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-upload-pack)$
^.*user/repo\.git\/(HEAD|info/refs|objects/info/.*|git-receive-pack)$
첫 번째는 항상 두 번째를 잡기 때문에 문제입니다.
좀 해보려고 했는데
if ($args = "service=git-receive-pack"){
//do redirect to user/repo.git/git-receive-pack but that will not work since
//info/refs?service=git-receive-pack must be called first.
}
정규식에 대한 도움이 필요하며 Nginx 위치에서 위치 쿼리 문자열을 일치시킬 수 없다는 것을 잊지 마십시오. 예를 들어
user/repo.git/info/refs?service=git-receive-pack
user/repo.git/git-receive-pack
간단한 `^과 일치할 수 있습니다.사용자/repo.git/.(git-수신-팩)$. Nginx의 첫 번째 경우는 위치가 user/repo.git/info/refs이기 때문에 일치하지 않으므로 작동하지 않습니다.
답변1
24시간 후에 해결했어요 :(
이것은 나에게서 작동하는 솔루션입니다.
location = /username/repo.git/info/refs {
if ($args ~ service=git-upload-pack) {
rewrite ^ /username/repo.git/git-upload-pack;
}
if ($args ~ service=git-receive-pack){
rewrite ^ /username/repo.git/git-receive-pack;
}
}
location ~ /username/repo.git/git-upload-pack {
gzip off;
if ( $request_method ~ POST ){
set $uri1 $uri;
}
if ( $request_method ~ GET ){
set $uri1 /username/repo.git/info/refs;
}
fastcgi_param PATH_INFO $uri1;
fastcgi_param REMOTE_USER daemon;
fastcgi_param GIT_PROJECT_ROOT /var/lib/gitolite/repositories;
fastcgi_param GITOLITE_HTTP_HOME /var/lib/gitolite;
fastcgi_param SCRIPT_FILENAME /usr/bin/gitolite-shell;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass 127.0.0.1:1234;
include fastcgi_params;
}
location = /username/repo.git/git-receive-pack{
gzip off;
if ( $request_method ~ POST ){
set $uri1 $uri;
}
if ( $request_method ~ GET ){
set $uri1 /username/repo.git/info/refs;
}
satisfy any;
auth_basic "Restricted Access for repository_path";
auth_basic_user_file "/usr/local/nginx/htpasswd";
auth_request /auth;
fastcgi_param PATH_INFO $uri1;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_param GIT_PROJECT_ROOT /var/lib/gitolite/repositories;
fastcgi_param GITOLITE_HTTP_HOME /var/lib/gitolite;
fastcgi_param SCRIPT_FILENAME /usr/bin/gitolite-shell;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass 127.0.0.1:1234;
include fastcgi_params;
}
이 nginx는 아파치의 공개 저장소에 대한 풀/푸시를 해결하는 데 5줄의 코드만 필요했기 때문에 짜증납니다. 나는 이 시간이 그만한 가치가 있기를 바랍니다.