Как настроить git через http?

Мне нужно настроить git-сервер с помощью git-over-http (smart http), но ресурсы, доступные онлайн, являются беспорядком, смешиваются с другой конфигурацией apache, отсутствуют детали или не являются достаточно явными.

Я отвечаю на этот вопрос сам, основываясь на том, что мне не хватало доступных ресурсов.

2 ответа

Решение

Для начала необходимо понять, что в git-over-http есть 2 компонента: git и apache. Эти два связаны через скрипт с именем git-http-backend. Задача состоит в том, чтобы настроить интерфейс между этими двумя компонентами так, чтобы запросы HTTP к git пересылались apache.

Примечание. Безопасность выходит за рамки данного руководства.

  1. Начните с установки git и apache2 с помощью менеджера пакетов вашего дистрибутива.

  2. Добавьте модули, необходимые apache для включения git-over-http. Это cgi, alias и env

$ a2enmod cgi alias env
  1. Скопируйте следующее в /etc/apache2/httpd.conf (без удаления чего-либо еще)
<VirtualHost *:80>
    SetEnv GIT_PROJECT_ROOT /data/git
    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
    ScriptAliasMatch \
        "(?x)^/(.*/(HEAD | \
        info/refs | \
        objects/(info/[^/]+ | \
        [0-9a-f]{2}/[0-9a-f]{38} | \
        pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
        git-(upload|receive)-pack))$" \
        "/usr/lib/git/git-http-backend/$1"
    Alias /git /data/git
    <Directory /usr/lib/git>
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. Теперь замените 2 вхождения /data/git с родительским каталогом ваших репозиториев git на сервере (не беспокойтесь, если у вас еще нет репозиториев, просто используйте каталог, в котором вы собираетесь разместить его / их)

Также замените /usr/lib/git/git-http-backend с расположением git-http-backend в вашей системе, которое можно найти с помощью $ find / -name git-http-backend

Это может быть, что в вашей системе REDIRECT_REMOTE_USER на самом деле перезаписывает действительный REMOTE_USER, Если эта настройка не работает после завершения, попробуйте удалить эту строку.

Согласно этому источнику, может потребоваться заменить две последние строки в теге Directory на Require all granted для apache 2.4 и выше.

  1. Перезапустите сервер Apache: $ apache2ctl -k graceful

Теперь сервер Apache настроен, но мы еще не закончили, есть некоторые важные части настройки репозиториев, которые будут влиять на то, работает эта установка или нет.

  1. Настройте репо:
$ mkdir myrepo.git
$ cd myrepo.git
$ git init --bare --shared
$ cp hooks/post-update.sample hooks/post-update
$ git update-server-info
$ chown -R wwwrun:www

Здесь важно понимать, что последняя строка меняет владельца репо на пользователя apache2. Этот пользователь может отличаться в вашей системе. Чтобы найти пользователя apache, выполните $ ps aux | egrep '(apache|httpd)', Затем, чтобы найти имя группы пользователя, выполните $ id user-name, В моей системе пользователь wwwrun и группа www. Заменить соответственно.

  1. Используйте репо

Для того, чтобы использовать репо, вам нужно знать URL. Для этой настройки URL-адрес является http://server.domain/myrepo.git

Примечание: http не будет работать.

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

$ git remote add origin http://server.domain/myrepo.git

Тогда вы можете взаимодействовать с ним, как с любым другим git-репо.

Несколько проектов с различными правами доступа

Гитолит есть, но сложный... Простое решение - создать макрос в apache2 conf как:

## Git root

SetEnv GIT_PROJECT_ROOT /opt/gitroot
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
SetEnv GITWEB_CONFIG /etc/gitweb.conf

##  SMART Http

ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/

<Directory "/usr/libexec/git-core*">
   Options +ExecCGI +Indexes
   Order allow,deny
   Allow from all
   Require all granted
</Directory>

<Macro Project $repository $developers $users>
    <LocationMatch "^/git/$repository.*$">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /opt/basic_auth
        Require $developers $users 
    </LocationMatch>
    <LocationMatch "^/git/$repository/git-receive-pack$">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /opt/basic_auth
        Require  $developers
    </LocationMatch>
 </Macro>

 IncludeOptional /opt/git_access.conf

И в /opt/git_access.conf

Use Project test1 "admin john" "mike"
Use Project test2 "admin emma" "all granted"

Таким образом, проект git test1 будет иметь права на чтение / запись от администратора и Джона, а доступ только для чтения - от Майка.

Проект test2 будет иметь доступ на чтение всем аутентифицированным пользователям.

Git_access.conf может быть сгенерирован вашими инструментами из базы данных ваших проектировщиков и пользователей, например, и перезагружен "сервисом httpd reload".

Для той же конфигурации для доступа на чтение gitweb добавьте в /etc/gitweb.conf:

$export_auth_hook = sub {
        my $repo = shift;
        my $user = $cgi->remote_user;
        if($repo =~ s/\/opt\/gitroot\///) {
           open FILE, '/opt/git_access'; 
           while(<FILE>) {
               if ($_ =~ m/Use Project $repo \"(.*)\" \"(.*)\"/)
                {
                    my $users = $1 . ' ' . $2;
                    $users =~ s/all granted/$user/;
                    $users =~ s/user//;
                    if ( $users =~ m/$user/ ) {
                        return 1;
                    }
                }              
            }
        }
        return 0;
};

Этот маленький хук gitweb скрывает (возвращает 0) репозитории git без доступа для чтения для текущего пользователя.

И в конфигурации apache2, классический gitweb conf:

## Gitweb  

Alias /gitweb /var/www/git

<Directory /var/www/git>
    AddHandler cgi-script .cgi
    DirectoryIndex gitweb.cgi
    Options +ExecCGI +Indexes +FollowSymlinks 
    AllowOverride None    
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /opt/basic_auth
    Require valid-user
</Directory>

Это мой конфиг.

Другие вопросы по тегам