Before...

모처럼 C#으로 개발할 일이 생겼습니다. Visual Studio 2015를 설치하고, git 저장소에 접속하려고 하는데 The SSH protocol is not supported라는 메세지가 나왔습니다. shell에서는 아무런 문제없이 사용하던 저장소였는데, Visual Studio랑 연동이 안되는 것이 었습니다. 조금 찾아 보니, Visual Studio는 SSH를 자체를 지원하지 못한다고 하네요. 그래서, HTTP로 접근 가능 하도록 update-server-info를 이용해서 HTTP 접근이 가능하도록 조치했습니다. 그랬더니, 이제는 early EOF 오류를 보이기 시작했습니다. 결론적으로 말씀드리면, Visual Studio는 Smart HTTP에 대한 접근만 허용한다고 합니다. 그냥 HTTP는 안되고 Smart HTTP만 된다는 것인데, 그게 뭐죠?

Smart HTTP

Smart HTTP란, git-http-backend라고 일컫는 CGI Script를 이용한 HTTP 통신을 뜻합니다. git-http-backend는 git이 설치될 때, git-core같은 폴더에 위치하고 있습니다. 이를, apache와 같은 web server에 올려서, 제공하면 되겠습니다.

Settings

directory & initialize

저장소를 꾸릴 위치를 지정해야겠죠. 또한 적절한 권한도 주어야 합니다. /opt 하위에 위치 시킬 생각이고, estimation이라는 프로젝트를 만들어 보겠습니다.

(by admin or sudo)
$ mkdir /opt/git 
$ cd /opt/git
$ git init --bare estimation
$ chown -R _www:_www /opt/git

관리자 권한이 필요한 일이라서, sudo로 작업하서야 합니다. 내용은 간단한데,

  • git init --bare : git repository를 생성하는 명령어 입니다. --bare는 평소 .git 의 내용이 상위 폴더에 저장된다고 생각하시면 되겠습니다. server에서는 직접적인 소스 작업을 할 필요가 없기 때문에, bare level로 만들게 됩니다.
  • chown -R _www:_www : 소유자와 그룹을 지정합니다. _www는 mac에서의 web 계정입니다.

install apache

apache가 필요로하는데, linux같은 경우에는 apt-get으로 설치하면 되겠습니다. 저의 경우에는 mac-mini였는데, mac은 이미 apache을 가지고 있습니다. System Preperences(환경 설정)에서 Sharing(공유)에 들어가시면, web sharing이라는 게 있습니다.(el capitan에는 안보이네요.) 체크를 활성화 시키면, 사실은 apachectl start명령(service apache2 start in linux)을 수행하는 것과 같습니다.

httpd.conf

apache를 사용하시면, httpd.conf를 통해 설정을 하게 됩니다. smart HTTP를 제공하기 위해서, git-http-backend를 사용하려면 당연히 conf파일을 수정해야 합니다. 다만, 오염의 우려가 있으니, /etc/apache2/others/에 별도의 conf 파일을 만들도록 하겠습니다. git.conf를 작성하기 전에, httpd.conf도 조금 수정되어야 합니다. 다음의 mod를 허용시켜주셔야 합니다. 주석만 풀어주시면 됩니다.

cgi, alias, env, rewrite

git.conf for apache

git.conf를 작성할 차례입니다.

SetEnv GIT_PROJECT_ROOT /opt/git
SetEnv GIT_HTTP_EXPORT_ALL

먼저, 환경 변수를 설정합니다. git 저장소의 root 폴더를 설정합니다. GIT_HTTP_EXPORT_ALL은 git-http-backend가 모든 repository를 접근할 수 있다는 뜻 입니다. 그렇지 않은 경우에는,

/opt/git/path/to/repository.git/git-daemon-export-ok

처럼, 처리해 주어야만 사용할 수 있습니다.

그런 다음에는 CGI 스크립트를 등록합니다.

ScriptAlias /git/ /Applications/Xcode.app/Contents/Developer/usr/libexec/git-core/git-http-backend/

윈도우라면, C:/Program Files/Git/libexec/git-core/git-http-backend.exe/이런 식이 될 것 입니다.

이후에는, Rewrite mod에 대한 내용을 작성합니다. 이는, URI에 대한 처리를 담고 있습니다.

RewriteEngine On
RewriteCond %{QUERY_STRING} service=git-receive-pack [OR]
RewriteCond %{REQUEST_URI} /git-receive-pack$
RewriteRule ^/git/ - [E=AUTHREQUIRED]

URI에 git-receive-pack이 포함되어 있다면, 인증이 필요함을 설정하고 있습니다. 마지막으로, <Files> 디렉티브를 이용해서 git-http-backend을 설정합니다.

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /opt/git/.htpasswd
    Require valid-user
    Order deny,allow
    Deny from env=AUTHREQUIRED
    Satisfy any
</Files>

.htpasswd라는 파일을 만들어서 허용된 리스트를 관리하는 아주 간단한 인증을 넣었습니다. 여기에 속한 사람만이 commit을 할 수 있게 되는 셈입니다. .htpasswd를 만드는 방법은 아주 간단합니다.

# -c : a option of creating file
$ htpasswd -c /opt/git/.htpasswd newUser 

Closing

이상, 아주 간단한 Smart HTTP를 지원하는 git을 구성했습니다.
git.conf의 전문은 아래와 같습니다.

[gist id="250bc083bcefbfec54de"]

References