В сети попадаются в основном два варианта конфигурации GIT репозитория с доступом по HTTP, с доступом через модуль WebDav и с использованием CGI скриптов git-core. Так как доступ через WebDav не обеспечивает выполнение hooks-скриптов то далее будет рассмотрено создание на Linux сервере GIT репозиториев с доступом по HTTP с использованием пакетов GIT(git-core), CGIT, Apache.
На сервере потребуются установленные пакеты: git(git-core если у вас это отдельный пакет), cgit, apache(уже настроенный на поддержку Virtualhost (см. директиву NameVirtualHost) и модулями: mod_rewrite,mod_auth возможно и др.). Использовались пакеты: apache:2.2.23, git:1.7.11.7, cgit:0.9.2. Проверялось на клиентах: Linux git, Windows + TortoiseGit-1.8.5.0.
Структура папок и файлов будет размещаться в /srv/git/
и выглядеть следующим образом:
/srv/git/ ├── cgit - папка для CGI скрипта │ └── cgit - cgi скрипт ├── repo - здесь будут размещаться репозитории │ ├── add_repo.sh - скрипт для создания репозиториев │ └── test - тестовый репозиторий ├── www - корневая папка сайта │ ├── cgit.css │ ├── cgit.png │ ├── favicon.ico │ └── readme.html ├── .cgit.cnf - настройки CGIT скрипта └── .git.conf - настройки сайта (виртуального хоста)
После установки пакета CGIT, необходимо скопировать его рабочие файлы к себе. Можно не копировать, но придётся изменить конфигурацию, этот вариант позволит автоматически обновлять пакет.
cp /var/www/cgi-bin/cgit /srv/git/cgit/cgit cp /usr/share/cgit/cgit.png /srv/git/www/cgit.png cp /usr/share/cgit/cgit.css /srv/git/www/cgit.css
Необязательные файлы favicon.ico (web иконка) и readme.html (описание репозитория, или краткая справка) создайте сами, либо возьмите любые подходящие, либо исключите их упоминание из конфигурации.
Конфигурацию CGIT скрипта разместим в файле /srv/git/.cgit.cnf
# Относительный путь к главной странице, для формирования страницы сайта скриптом. virtual-root=/ # Путь к картинке логотипа и стилям относительно главной страницы, для выдачи скриптом. css=/cgit.css logo=/cgit.png # Описание, почему-то работает только с абсолютным путём, скрипт подставляет данную страницу в вывод about. root-readme=/srv/git/www/readme.html # Заголовок репозиториев root-title=GIT # Подзаголовок root-desc=GIT repositories # Период сбора статистики (за квартал) max-stats=quarter # Путь для автоматического сканирования Git репозиториев. scan-path=/srv/git/repo # Дополнительные настройки... enable-index-links=1 enable-commit-graph=1 enable-log-filecount=1 enable-log-linecount=1 # Разрешаем скачивание репозитариев, веток или коммитов архивами (у меня не заработало) snapshots=tar.gz tar.bz2 zip # На всякий случай из конфига по умолчанию mimetype.gif=image/gif mimetype.html=text/html mimetype.jpg=image/jpeg mimetype.jpeg=image/jpeg mimetype.pdf=application/pdf mimetype.png=image/png mimetype.svg=image/svg+xml
Создавать новые репозитории удобнее скриптом /srv/git/repo/add_repo.sh
, возможно в нём много лишнего, но у меня не получилось push-ить через http в пустой репозиторий.
#!/bin/bash mkdir ./.temp cd ./.temp git init echo "Git Repo $1" > info.txt git add . git commit -am "init repo $1" cd .. mkdir $1 cd $1 git --bare init cd ../.temp git remote add hub ../$1 git remote show hub git push hub master cd .. rm -R -f ./.temp cp ./$1/hooks/post-update.sample ./$1/hooks/post-update chown -R apache.apache ./$1
Перейдём в папку для репозиториев и создадим репозиторий для тестов:
cd /srv/git/repo ./add_repo.sh test
Самое главное, настройка виртуального хоста, наш сервер будет доступен по адресу http://git.example.com (замените в конфигурации example.com на своё имя домена)
<VirtualHost *:80> ServerName git.example.com ServerAdmin webmaster@example.com DocumentRoot /srv/git/www ErrorLog /srv/git/log.git.error # Если понадобиться отлаживать правила mod_rewrite, раскомментируйте. #RewriteLog /srv/git/log.mod_rewrite #RewriteLogLevel 9 # Имя файла по умолчанию (а данном случае не имеет значения), вернём описаине. DirectoryIndex readme.html # Запрещаем просмотр папок. Options -Indexes -FollowSymlinks -MultiViews # Путь к файлу конфигурации CGIT. SetEnv CGIT_CONFIG /srv/git/.cgit.cnf # Путь к CGI скрипту CGIT ScriptAlias /cgit/ /srv/git/cgit/cgit/ # Настройки для git-core, путь к репозиториям. SetEnv GIT_PROJECT_ROOT /srv/git/repo SetEnv GIT_HTTP_EXPORT_ALL # Путь к CGI скриптам git-core, у вас могут размещаться в др. месте. ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ # Включаем преобразование RewriteEngine on # Запросы к файлам не преобразовываем. Правило с относительно DocumentRoot не работает(? не читаю маны). RewriteCond %{REQUEST_METHOD} ^GET$ [NC] # К файлам только GET запросы, RewriteCond /srv/git/www%{REQUEST_FILENAME} -f [NC] # Проверим существование файла, RewriteRule ^/.+$ - [NC,L,QSA] # Если файл, дальнейшие преобразование делать не будем. # Если не git-core GET запрос отправим к CGIT RewriteCond %{REQUEST_METHOD} ^GET$ [NC] RewriteCond %{REQUEST_URI} !^.*/info/refs$ [NC] RewriteCond %{REQUEST_URI} !^.*/HEAD$ [NC] RewriteCond %{REQUEST_URI} !^.*/objects/info/[^/]+ [NC] RewriteCond %{REQUEST_URI} !^.*/objects/[0-9a-f]{2}/[0-9a-f]{38}$ [NC] RewriteCond %{REQUEST_URI} !^.*/pack/pack-[0-9a-f]{40}\.(pack|idx)$ [NC] RewriteCond %{REQUEST_URI} !^.*/git-upload-pack$ [NC] RewriteRule ^/(.*)$ /cgit/$1 [NC,NS,PT,QSA] # Все что не попало в предыдущие правила и является GET/POST запросом, отправим в git-core. RewriteCond %{REQUEST_METHOD} ^(GET|POST)$ [NC] RewriteRule ^/(.*)$ /git/$1 [NC,NS,PT,QSA] # Права доступа к скрипту и сопровождающим файлам <Directory /srv/git/cgit/> AllowOverride None Options +ExecCGI Order Allow,Deny Allow from All </Directory> <Directory /usr/libexec/git-core/> AllowOverride None Options +ExecCGI Order Allow,Deny Allow from All # git-core без авторизации не хочет отвечать на запросы. # поэтому вам потребуется valid-user. AuthType Basic AuthName "GIT Repositories" AuthUserFile /srv/web/.httppasswd Require valid-user </Directory> # Права доступа к репозиториям <Directory /srv/git/repo/> AllowOverride All Order Allow,Deny Allow from All </Directory> </VirtualHost>
Осталось создать файл парольного доступа htpasswd -c /srv/web/.httppasswd первый_пользователь
Добавлять следующих пользователей следует командой htpasswd /srv/web/.httppasswd следующий_пользователь
И последнее, заменим владельца для всех файлов для исключения ошибок доступа:
chown -R apache.apache /srv/git
Теперь перезагрузите сервер service httpd reload
и пользуйтесь работающим сервером, либо ищите ошибки по логам :)