Как настроить git через http?
Мне нужно настроить git-сервер с помощью git-over-http (smart http), но ресурсы, доступные онлайн, являются беспорядком, смешиваются с другой конфигурацией apache, отсутствуют детали или не являются достаточно явными.
Я отвечаю на этот вопрос сам, основываясь на том, что мне не хватало доступных ресурсов.
2 ответа
Для начала необходимо понять, что в git-over-http есть 2 компонента: git и apache. Эти два связаны через скрипт с именем git-http-backend. Задача состоит в том, чтобы настроить интерфейс между этими двумя компонентами так, чтобы запросы HTTP к git пересылались apache.
Примечание. Безопасность выходит за рамки данного руководства.
Начните с установки git и apache2 с помощью менеджера пакетов вашего дистрибутива.
Добавьте модули, необходимые apache для включения git-over-http. Это cgi, alias и env
$ a2enmod cgi alias env
- Скопируйте следующее в
/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>
- Теперь замените 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 и выше.
- Перезапустите сервер Apache:
$ apache2ctl -k graceful
Теперь сервер Apache настроен, но мы еще не закончили, есть некоторые важные части настройки репозиториев, которые будут влиять на то, работает эта установка или нет.
- Настройте репо:
$ 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. Заменить соответственно.
- Используйте репо
Для того, чтобы использовать репо, вам нужно знать 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>
Это мой конфиг.