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

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

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

2 ответов


сначала необходимо понять, что есть 2 компонента для Git-over-http: 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/"
    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. Если эта настройка не работает по завершении, попробуйте удалить эту строку.

по данным этой источник, возможно, потребуется заменить последние две строки в теге каталога на 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.домен/myrepo.git

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

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

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

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


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

есть gitolite'у, но сложный... Простое решение-создать макрос в 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 =  . ' ' . ;
                    $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>

Это моя конфигурация.