Gitweb is a nice web interface for Git repositories. For instance go to http://git.kernel.org/ to see how it looks like. I find it useful especially when I'm using the machine of somebody else and need to check out some files from one of my own repositories. git-http-backend allows me to clone git repositories over HTTPS so I don't have to use SSH.
First you have to prepare your repositories on your server for accessing them via HTTPS. I would recommend to create an extra user "git" for it. In this example I put my repositories to /home/git/repositories. Basically you can put them where you want.
useradd -m git su git git clone --bare /old/repo.git /home/git/repositories/repo.git cd /home/git/repositories/repo.git sudo chmod -R g+ws . # Setting necessary rights for pushing to the repository. sudo chgrp -R git .
Now configure your repositories:
git --bare update-server-info cp hooks/post-update.sample hooks/post-update chmod a+x hooks/post-update
This generates all the information that is necessary to share the repository using a webserver like NGINX.
I found a nice tutorial about how to set up NGINX for gitweb and git-http-backend here. It almost worked out-of-the-box for me. I just had to add following lines to fix some errors I got when I tried to work with git-http-backend.
fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param REMOTE_USER $remote_user;
Furthermore, I have added the auth_basic lines to restrict the access to my repositories. The configuration shown below has been tested with Ubuntu 12.04.
But first make sure you have all required packages installed:
(sudo) apt-get install git gitweb fcgiwrap
Here is my NGINX configuration file for Gitweb and git-http-backend. It allows access only using HTTPS and asks for authentication both for the web interface and for cloning the repositories. It works basically like the .htaccess authentication mechanism from Apache.
server {
listen 80;
server_name git.weinimo.de;
access_log /var/log/nginx/git.weinimo.de.access.log;
rewrite ^ https://$server_name$request_uri? permanent;
}
# HTTPS server
#
server {
listen 443;
server_name git.weinimo.de;
root /usr/share/gitweb;
access_log /var/log/nginx/git.weinimo.de.access.log;
ssl on;
ssl_certificate /etc/ssl/certs/certforyoursite.crt;
ssl_certificate_key /etc/ssl/private/sitekey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!ADH:!MD5;
ssl_prefer_server_ciphers on;
auth_basic "RESTRICTED ACCESS";
auth_basic_user_file /etc/nginx/access_list;
# static repo files for cloning over https
location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
root /home/git/repositories/;
}
# requests that need to go to git-http-backend
location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
root /home/git/repositories;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param PATH_INFO $uri;
fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param REMOTE_USER $remote_user;
include fastcgi_params;
}
# send anything else to gitweb if it's not a real file
try_files $uri @gitweb;
location @gitweb {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /usr/share/gitweb/gitweb.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
include fastcgi_params;
}
}
Comments !