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