Git — это бесплатная система контроля версий с открытым исходным кодом, которую можно использовать для отслеживания изменений кода. Git позволяет вам создавать множество репозиториев для одного и того же приложения и координировать работу над этими файлами среди множества людей. В основном используется для управления исходным кодом при разработке программного обеспечения.
В этой статье я расскажу, как установить HTTP-сервер Git с Nginx на Ubuntu 18.04 LTS (Bionic Beaver).
Вводные данные
- Чистый, свежий Ubuntu 18.04 server.
- Пользователь sudo c правами root.
- Статичный IP адрес настроенный на вашем сервере. В инструкции я укажу его как 192.168.1.100.
Перед установкой
Первое что нужно сделать — обновить систему.
sudo apt-get update -y sudo apt-get upgrade -y
Устанавливаем пакеты
sudo apt-get install nginx git nano fcgiwrap apache2-utils -y
После установки пакетов, создадим директорию где будут храниться репозитории git
sudo mkdir /var/www/html/git
Теперь сменим владельца этой директории, чтобы у http-сервера были права на неё
sudo chown -R www-data:www-data /var/www/html/git
Настраиваем nginx
Во-первых, вам нужно настроить Nginx для передачи трафика Git в Git. Вы можете сделать это, отредактировав файл конфигурации Nginx по умолчанию (некоторые моменты прокомментированы):
# Default server configuration # server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/git; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; server_name _; location / { # Сначала пробуем получить запрашиваемый URL как файл, # затем как директорию, при неудаче показываем 404. try_files $uri $uri/ =404; } location ~ (/.*) { client_max_body_size 0; # Git push может быть массивным, просто чтобы убедиться, что nginx не разорвал соединение, добавьте это. auth_basic "Git Login"; # Текст отображаемый при запросе окна логина. auth_basic_user_file "/var/www/html/git/htpasswd"; #файл с паролями include /etc/nginx/fastcgi_params; # Подключаем конфиг fastcgi с параметрами по умолчанию fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; # Сообщает fastcgi передать запрос исполняемому файлу git http backend fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param GIT_PROJECT_ROOT /var/www/html/git; # /var/www/git это расположение всех ваших git репозиториев. fastcgi_param REMOTE_USER $remote_user; fastcgi_param PATH_INFO $1; # Передает перехваченую группу нашей локации в git. fastcgi_pass unix:/var/run/fcgiwrap.socket; # Передает запрос в fastcgi } }
Сохраняем и закрываем. Проверяем конфиг на корректность
sudo nginx -t
Если всё нормально, то идём дальше. если нет — ищем где накосячили, пропустили скобку, точку с запятой, итд.
Теперь вам нужно будет создать учетную запись пользователя, которую вам нужно будет использовать для просмотра коммитов в репозитории. Вы можете создать пользователя с именем user1 с помощью утилиты htpasswd:
sudo htpasswd -c /var/www/html/git/htpasswd user1
Теперь перезапускаем nginx
sudo systemctl restart nginx
Создание GIT-репозитория
Наконец, сконфигурировав всё правильно, создадим репозиторий git.
cd /var/www/html/git sudo mkdir user1.git sudo cd hitesh.git sudo git --bare init sudo git update-server-info sudo chown -R www-data.www-data . sudo chmod -R 755 .
Для удобства добавления репозитория можно использовать скрипт bash
git-repo-create.sh :
#!/bin/bash GIT_DIR="/var/www/html/git" REPO_NAME=$1 sudo mkdir -p "${GIT_DIR}/${REPO_NAME}.git" sudo cd "${GIT_DIR}/${REPO_NAME}.git" sudo git --bare init sudo git update-server-info sudo chown -R www-data.www-data . sudo chmod -R 755 . echo "Git repository '${REPO_NAME}' created in ${GIT_DIR}/${REPO_NAME}.git"
дайте права скрипту на выполнение:
sudo chmod +x git-repo-create.sh
Теперь репозиторий добавлять станет проще:
sudo git-repo-create user222
Тестируем Git на пользовательской машине
Устанавливаем Git
sudo apt-get install git -y
Создадим локальный репозиторий
sudo mkdir ~/testproject
Теперь перейдем в созданную директорию и инициализируем там удаленный репозиторий
cd ~/testproject git init git remote add origin http://user1@192.168.1.100/user1.git
Теперь создадим в нашем проекте что-нибудь
mkdir test1 test2 test3 echo "Это первый репозиторий" > test1/repo1 echo "Это второй репозиторий" > test2/repo2 echo "Это третий репозиторий" > test3/repo3
Теперь добавим все файлы и папки в репозиторий, и выполним коммит:
git add . git commit -a -m "Add files and directories"
Примерный вывод:
[master 007fac9] Add files and directories 3 files changed, 3 insertions(+) create mode 100644 repo1 create mode 100644 repo2 create mode 100644 repo3
Теперь отправим наш коммит на удаленный репозиторий:
git push origin master
Вывод показанный git будет типа такого:
Password for 'http://user1@192.168.1.100': Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (5/5), 422 bytes | 0 bytes/s, done. Total 5 (delta 0), reused 0 (delta 0) To http://user1@192.168.1.100/user1.git 68f1270..007fac9 master -> master
Всё. ваши файлы и директории отправленны на сервер.
Итак. процесс создания вашего репозитория завершен. Вы теперь в любой момент можете на любой машине клонировать ваш репозиторий
git clone user1@192.168.1.100:/var/www/html/git/user1.git
В ответе будет:
Cloning into 'user1'... user1@192.168.1.100's password: remote: Counting objects: 8, done. remote: Compressing objects: 100% (3/3), done. Receiving objects: 100% (8/8), 598 bytes | 0 bytes/s, done. remote: Total 8 (delta 0), reused 0 (delta 0) Checking connectivity... done.
Проверим склонированный репозиторий перейдя в директорию куда мы его склонировали:
cd user1 tree
Вы увидите подобный этому вывод:
. |-- test1 | `-- repo1 |-- test2 | `-- repo2 `-- test3 `-- repo3 3 directories, 3 files
Ну, а дальше — нет предела совершенству. Всё в ваших руках. настраивайте, дорабатывайте. Если поймете что ваше хозяйство слишком разрослось, возможно что вам тогда надо будет задуматься о переходе на более сложную систему управления git-репозиториями и пользователями. Например gitlab.