Инструменты пользователя

Инструменты сайта


cvs:git:cgit

Настройка CGIT репозитория с доступом через http

В сети попадаются в основном два варианта конфигурации 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 и пользуйтесь работающим сервером, либо ищите ошибки по логам :)

cvs/git/cgit.txt · Последнее изменение: 2014/10/29 20:35 — 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki