Собственный git с преферансом и поэтессами

Заметка скорее для себя, на память…
Цель работы:
Настроить репозиторий git с доступом по протоколу HTTP и web-интерфейсом

Приборы и материалы:

  • сервер с ubuntu (debian)
  • apache2 (будем работать по HTTP)
  • git (ради него все и затевалось)
  • gitweb (веб-морда)

Теория
git прекрасно работает с удаленными репозиториями по протоколу HTTP, для реализации со стороны сервера будем использовать apache2 с модулем dav_fs. В качестве авторизации воспользуемся штатными средствами apache2 (AuthType Basic).
В качестве дополнительных плюшек, запустим GitWeb (тот самый, который используется на kernel.org

Порядок выполнения работы:

  1. Если не установлен, устанавливаем apache2:
    $ sudo apt-get install -y apache2
  2. Включаем модуль dav_fs:
    $ sudo a2enmod dav_fs
  3. Включаем (если еще не включен) mod_rewrite:
    $ sudo a2enmod rewrite
  4. Устанавливаем GitWeb из репозитория ubuntu (debian):
    $ sudo apt-get install -y gitweb
  5. Создаем папку с репозиториями:
    $ sudo mkdir -p /srv/git
  6. Добавляем к виртуальный хост настройки DAV, MOD_REWRITE и алиасы GitWeb:
    <VirtualHost *:80>
            ServerAdmin     root@example.com
            ServerName      git.example.com
            ServerAlias     git
            # путь до папки с репозиториями
            DocumentRoot    /srv/git
            DirectoryIndex  gitweb.cgi
            SetEnv          GITWEB_CONFIG   /etc/gitweb.conf
            RewriteEngine   on
            RewriteRule     ^/$  /gitweb [PT]
    
            RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
            RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
            # исключаем из подстановки системные объекты git 
            # - к ним обращаемся непосредственно
            RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !/git/[a-zA-Z0-9-]+\.git/(HEAD|info|objects|refs)
            RewriteRule ^/git/(.*) /gitweb%{REQUEST_URI}     [PT]
            ScriptAlias /gitweb /usr/lib/cgi-bin/gitweb.cgi
            Alias /gitweb.css /usr/share/gitweb/static/gitweb.css
            Alias /git-logo.png /usr/share/gitweb/static/git-logo.png
            Alias /git-favicon.png /usr/share/gitweb/static/git-favicon.png
            Alias /gitweb.js /usr/share/gitweb/static/gitweb.js
            Options Indexes FollowSymlinks ExecCGI
            <Directory />
                    # Включаем DAV
                    Dav on
                    # И авторизацию 
                    AuthType Basic
                    AuthName "Only the chosen pass..."
                    AuthUserFile /etc/apache2/git-passwd
                    Require valid-user
            </Directory>
            # устанавливаем обработчик
            <Files gitweb.cgi> 
              SetHandler cgi-script 
            </Files> 
            ErrorLog /var/log/apache2/git-error.log
            LogLevel warn
            CustomLog /var/log/apache2/git-access.log combined
    </VirtualHost>
    

    сохраняем в /etc/sites-availible/git.example.com
    включаем сайт:
    $ sudo a2ensite git.example.com
    не забываем про файл с паролями:
    $ sudo htpasswd -c -b /etc/apache2/git-passwd user password
    и перезагружаем apache2: $ sudo service apache2 restart

  7. Настраиваем GitWeb (/etc/gitweb.conf)
    $projectroot = "/pub/git";
    $git_temp = "/tmp";
    $home_link = $my_uri || "/";
    $home_text = "indextext.html";
    $projects_list = $projectroot;
    @stylesheets = ("gitweb.css");
    $javascript = "gitweb.js";
    $logo = "git-logo.png";
    $favicon = "git-favicon.png";
    @diff_opts = ();

    От настроек по-умолчанию отличается только $projectroot и путем до файлов

Создание репозитория:
Репозиторий git создается в пустой папке с ключем —bare, тогда он не будет содержать локальной копии файлов, а dav_fs и WebGit будет общаться напрямую с базой данных git:
$ sudo mkdir -p /srv/git/test.git && cd /srv/git/test.git && git init —bare && git update-server-info

Описание репозитория находится в файле description, по желанию можно отредактировать любым текстовым редактором.

После создания, нужно сделать hook post-update с командой git update-server-info, он уже имеется в семплах, под названием hooks/post-update.sample, остается только переименовать его. А так же разрешить доступ для записи apache2, если с репозиторием предстоит работать только через apache2, можно сменить владельца всей папки:
$ sudo chown -R www-data.www-data /srv/pub

Выводы:
Теперь можно клонировать на удаленном компьютере:
$ git clone http://user:password@git.example.com/test.git
добавить файл:
$ cd test.git
$ echo TEST > readme.txt

добавить его в git:
$ git add .
создать коммит:
$ git commit -m «Initial commit»
и залить на удаленный сервер:
$ git push origin master