Краткое руководство по быстрому развёртыванию собственного git сервера с веб-интерфейсом в связке git + Apache HTTP Server + gitweb на ОС Gentoo GNU/Linux.
Перед тем, как начинать разворачивать сервер, необходимо убедиться в наличии полных имён хостов в файле /etc/hosts
# nano /etc/hosts
После строки
127.0.0.1 localhost
дописать такую:
127.0.1.1 gvm45.homenet.local gvm45
Затем создаём файл /etc/portage/package.use/git
# touch /etc/portage/package.use/git
открываем его
# nano /etc/portage/package.use/git
и пропишем в нём такую строчку:
# dev-vcs/git cgi highlight
- cgi поможет нам с установкой gitweb
- highlight — подсветка кода
Запускаем установку git
# emerge -av dev-vcs/git
gitweb будет автоматически установлен в /usr/share/gitweb/
Затем устанавливаем apache-tools
# emerge --ask app-admin/apache-tools
а также сам apache
# emerge --ask apache
Запускаем необходимые для работы службы и включаем их в автозагрузку
# rc-service apache2 start # rc-update add apache2 default # rc-service git-daemon start # rc-update add git-daemon default
Теперь откроем файл /etc/conf.d/git-daemon
# nano /etc/conf.d/git-daemon
и исправим там строки:
GITDAEMON_OPTS="--syslog --enable=receive-pack --base-path=/pub/git" GIT_USER="nobody" GIT_GROUP="nobody"
на:
GITDAEMON_OPTS="--syslog --export-all --enable=receive-pack --base-path=/var/git" GIT_USER="apache" GIT_GROUP="apache"
Затем создадим каталог /var/git/, в котором будут храниться проекты
# mkdir /var/git/
Далее создадим директорию для хранения данных о логинах и паролях пользователей
# mkdir /etc/apache2/gitusers/
После этого открываем файл /etc/apache2/httpd.conf
# nano /etc/apache2/httpd.conf
и в самом конце допишем
Include /etc/apache2/httpd_git.conf
Теперь создадим файл /etc/apache2/httpd_git.conf для хранения конфигурации Apache для нашего git-сервера
# touch /etc/apache2/httpd_git.conf
открываем его
# nano /etc/apache2/httpd_git.conf
и прописываем такие строки:
SetEnv GIT_PROJECT_ROOT /var/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ <Location /git> Options ExecCGI AuthName "Login to Git" AuthType Basic AuthUserFile /etc/apache2/gitusers/.htpasswd Require valid-user </Location>
Затем создадим пользователя gituser с помощью утилиты htpasswd
# htpasswd -c /etc/apache2/gitusers/.htpasswd gituser
Теперь перезапустим службы apache2 и git-daemon
# rc-service apache2 restart # rc-service git-daemon restart
Затем создадим репозиторий gitproject.git и инициализируем его
# mkdir /var/git/gitproject.git/ # cd /var/git/gitproject.git/ # git init --bare --shared
В консоли должно появиться такое сообщение:
подсказка: Using 'master' as the name for the initial branch. This default branch name подсказка: is subject to change. To configure the initial branch name to use in all подсказка: of your new repositories, which will suppress this warning, call: подсказка: подсказка: git config --global init.defaultBranch <name> подсказка: подсказка: Names commonly chosen instead of 'master' are 'main', 'trunk' and подсказка: 'development'. The just-created branch can be renamed via this command: подсказка: подсказка: git branch -m <name> Инициализирован пустой общий репозиторий Git в /var/git/gitproject.git/
Далее дадим права группе apache для этого репозитория
# chgrp -R apache /var/git/gitproject.git/
После этого создадим проект в директории /var/lib/git/gitproject.git/ и инициализируем его
# mkdir project/ # cd project/ # git init
В консоли должно появиться такое сообщение:
подсказка: Using 'master' as the name for the initial branch. This default branch name подсказка: is subject to change. To configure the initial branch name to use in all подсказка: of your new repositories, which will suppress this warning, call: подсказка: подсказка: git config --global init.defaultBranch <name> подсказка: подсказка: Names commonly chosen instead of 'master' are 'main', 'trunk' and подсказка: 'development'. The just-created branch can be renamed via this command: подсказка: подсказка: git branch -m <name> Инициализирован пустой репозиторий Git в /var/git/gitproject.git/project/.git/
Теперь в директории /var/git/gitproject.git/hooks/ скопируем (или переименуем) файл post-update.sample в post-update
# cp /var/git/gitproject.git/hooks/post-update.sample /var/git/gitproject.git/hooks/post-update
Затем настраиваем пользователя gituser
# git config --global user.email "gituser@homenet.local" # git config --global user.name "gituser"
После этого создадим новую запись для нового подключения к репозиторию
# git remote add origin http://gituser@gvm45.homenet.local/git/gitproject.git
Также создадим некоторые данные, например, директорию text с файлом example.txt
# mkdir text/ # touch text/example.txt # nano text/example.txt
запишем какой-нибудь текст в этот файл:
Welcome to Git Server
Добавим содержимое рабочего каталога в индекс
# git add .
Сохраним изменения в рабочем каталоге
# git commit -a -m "Test Commit"
В консоли должен отобразиться такой текст:
[master (корневой коммит) 8890a77] Test Commit 1 file changed, 2 insertions(+) create mode 100644 text/example.txt
Выгружаем содержимое локального репозитория в удалённый
# git push origin master
появится запрос пароля, который необходимо будет ввести:
Password for 'http://gituser@gvm45.homenet.local':
В консоли должны отобразиться данные о выгрузке:
Перечисление объектов: 4, готово. Подсчет объектов: 100% (4/4), готово. Запись объектов: 100% (4/4), 276 байтов | 138.00 КиБ/с, готово. Всего 4 (изменений 0), повторно использовано 0 (изменений 0), повторно использовано пакетов 0 To http://gvm45.homenet.local/git/gitproject.git * [new branch] master -> master
Обновляем данные
# git update-server-info
Далее переходим к клиенту.
Склонируем удалённый репозиторий
# git clone http://gituser@gvm45.homenet.local/git/gitproject.git
Сообщение в консоли должно быть таким:
Cloning into 'gitproject'... remote: Enumerating objects: 4, done. remote: Counting objects: 100% (4/4), done. remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (4/4), done.
Затем перейдём в каталог gitproject/
# cd gitproject/
откроем файл text/example.txt
# nano text/example.txt
и внесём в него какой-нибудь текст:
Yes, it works!
Также в директории text создадим файл privet.txt и откроем его
# touch text/privet.txt # nano text/privet.txt
и в нём тоже напишем что-нибудь:
Hello, world!
Теперь добавим содержимое в индекс
# git add .
сохраним изменения
# git commit -a -m "Commit from client"
консоль покажет нам такое сообщение:
[master 7bf3560] Commit from client 2 files changed, 4 insertions(+) create mode 100644 text/privet.txt
и отправим на сервер в удалённый репозиторий
# git push
в консоли отобразится такое сообщение:
Enumerating objects: 8, done. Counting objects: 100% (8/8), done. Delta compression using up to 2 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (5/5), 378 bytes | 54.00 KiB/s, done. Total 5 (delta 0), reused 0 (delta 0), pack-reused 0 To http://gvm45.homenet.local/git/gitproject.git 8890a77..7bf3560 master -> master
Это значит, что наш git-сервер настроен и готов к использованию.
После этого переходим к настройке веб-интерфейса gitweb
Откроем файл /usr/share/gitweb/gitweb.cgi
# nano /usr/share/gitweb/gitweb.cgi
и исправим строчку
our $projectroot = "/pub/git";
на
our $projectroot = "/var/git";
Затем создадим файл конфигурации gitweb
# touch /etc/gitweb.conf
откроем его
# nano /etc/gitweb.conf
и добавим туда строчку
$projectroot = "/var/git";
Далее открываем файл конфигурации apache для git
# nano /etc/apache2/httpd_git.conf
и допишем в него следующие строки:
Alias /gitweb /usr/share/gitweb <Directory /usr/share/gitweb> Options +ExecCGI AddHandler cgi-script .cgi DirectoryIndex gitweb.cgi Require all granted </Directory>
Перезапускаем службу apache2
# rc-service apache2 restart
Если ошибок нет, то веб-интерфейс настроен.
На другой машине в сети в строке браузера вводим адрес http://gvm45.homenet.local/gitweb/ и мы должны будем увидеть список созданных проектов:
Здесь он пока один.
Кликнув на проект можно увидеть историю его коммитов