Совместная работа над проектом включает множество корпоративных инструментов и платформ. Для накопления знаний и документации – Wiki платформа, для управления рабочими процессами CRM, для управления и доступа к данным – базы данных и т.д. Однако важным компонентом, при работе с кодом, документацией, а так же файлами остается Git!
Что такое Git?
Git – это система контроля версий репозитория, которая представляет собой платформу для управления репозиториями хранимых на сервере. Используется в основном для распространения ПО для неопределенного круга лиц или же предоставления доступа для совместной работы команды над проектом. Для начала определимся с понятиями и сущностями, которые используются, при работе с Git:
- Working tree (Рабочая директория) – папка, в которой хранятся файлы для работы пользователей и директория .git;
- Index (Индекс) – промежуточный модуль, который хранит изменения Working tree;
- Commit (Снимок директории) – снимок рабочей директории с учетом изменений записанных в Index;
- Repository (Репозиторий)- архив из commit или же снимков рабочей директории.
Всю работу с репозиториями можно представить в виде схемы из трех сущностей:

Работа пользователя начинается с инициализации репозитория в определенную папку командой:
git init /путьПосле чего создаются три основные сущности для работы Git: Working Tree, Index, Repository. Папка, в которой создана директория .git считается Working Tree и именно в ней хранятся файлы. Все изменения внесенные в рабочую директорию регистрируются в Index командой:
git add /путь Изменения Working Tree зарегистрировались, после чего можно сформировать Commit или же снимок рабочей директории, который направится в репозиторий.
git commit ./ На сейчас сформирован commit в виде объекта, который хранится в объектах. Далее мы можем направит в локальный репозиторий, по умолчанию командой:
git push origin master Где origin-путь, а master-главная ветка. Либо переопределить путь origin на удаленный репозиторий и выполнить команду:
git remote add origin git@ip-адрес:/путь-к-репозиторию && git push origin masterПосле чего Commit будет отправлен в хранилище или же Repository, где на зарегистрирует commit под названием master. В дальнейшем, любой пользователь сможет скачать себе эту версию commit и использовать ее у себя локально. Реализуется командой:
git clone git@ip-адрес:/путь-к-репозиторию А как это применить на практике? Поднимем свой Git-сервер!
Как быстро создать свой Git сервер?
Все действия были выполнены в среде облачного сервера от Serverspace, для этого перейдем к созданию сервера, на любой из двух платформ vStack cloud или же VMware cloud. Нажмем на кнопку Создать сервер и выберем конфигурацию, подходящую под наши задачи, затем нажмем кнопку Создать:
Скриншот №2 — Создание сервера
Установим на машине пакет git через команду, для deb-подобных дистрибутивов:
apt install git И отдельная команда для rpm-подобных версий, через менеджер пакетов yam/dnf:
yam install git 
Для аутентификации на сервере будет работать SSH под пользователем git и проводить авторизацию через ключи. Чтобы пользователь не мог выполнить вредоносные команды в обычную оболочку необходимо будет указать для него git-shell, через который можно выполнить только команды git. Для этого создадим пользователя git:
adduser git -c "Точка входа" -s $(which git-shell) 
Так как сервер SSH уже настроен на аутентификацию только по ключам, необходимо передать список открытых ключей пользователей в домашнюю директорию git.
mkdir /home/git/.ssh && ssh-keygen git По правилам дискреционного доступа ключи будут наследовать права пользователя создателя и их необходимо изменить, как и директорию хранения:
mv /home/root/.ssh/git /home/git/.ssh/git \
mv /home/root/.ssh/git.pub /home/git/.ssh/git.pub \
cp /home/root/.ssh/authorized_keys /home/git/.ssh/authorized_keysТеперь перейдем к клиенту и найдем его открытый ключ, а если его нет, то дополним командой ssh-keygen:
cat /home/ваш-пользователь/.ssh/id_rsa.pub
Скопируйте отобразившийся ключ, он должен выглядеть следующим образом:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCjqQj9A+66iGuq3DYVXWTyHNBklggCdesWQqyIjLfo+aHirIfv5in7d2jFsv6w3HqBumi7PTyIVRsH50y5AWO4nxhE9RJykdKnZ9NAok6XoJk//nVmafIDpyFf5MxrqId02tyrdPT8kIJHPDM2uEANoIpRSvEYqaC39dN1MHK8208nPVxdJ2FV/PNBmBgDnG+Bl89THg6vHUaEfVfNVw5qz1rm7OZ8Z9Eksqv0ErSUq0vHDnJh24oTf9wh6iWDOEgFhVOWQjlLzN2cZn1yk4Ol2hxmZwUcrpjyLRg7n7/Djc1RKJPfxRqOftb8GY8ZICpWJSKOUPooVE9dMxFrgRcb0MQVtreGY2ZU8awcLhpKkvOz4MnwzdbmlUIGprCxdmfy0bQT6QpbKPWEBgee+6uGmVsnP6iJQnFRwNSQw3bxgnQue8l0r2IJ9LTzXVNkjaIJTu17QOsH+HSXcFlFok44PUEqSlaDL+QWyf4DZ8QIknzJ7eorgNxGjCmmqhtLrDc= root@df Для защиты устройства от обращения к другим серверам – добавим в начало строки no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty и получим следующую запись и сразу запишем в авторизованные ключи. Не забудьте перейти обратно на сервер, ведь именно там мы вставляем ключ клиента:
echo "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCjqQj9A+66iGuq3DYVXWTyHNBklggCdesWQqyIjLfo+aHirIfv5in7d2jFsv6w3HqBumi7PTyIVRsH50y5AWO4nxhE9RJykdKnZ9NAok6XoJk//nVmafIDpyFf5MxrqId02tyrdPT8kIJHPDM2uEANoIpRSvEYqaC39dN1MHK8208nPVxdJ2FV/PNBmBgDnG+Bl89THg6vHUaEfVfNVw5qz1rm7OZ8Z9Eksqv0ErSUq0vHDnJh24oTf9wh6iWDOEgFhVOWQjlLzN2cZn1yk4Ol2hxmZwUcrpjyLRg7n7/Djc1RKJPfxRqOftb8GY8ZICpWJSKOUPooVE9dMxFrgRcb0MQVtreGY2ZU8awcLhpKkvOz4MnwzdbmlUIGprCxdmfy0bQT6QpbKPWEBgee+6uGmVsnP6iJQnFRwNSQw3bxgnQue8l0r2IJ9LTzXVNkjaIJTu17QOsH+HSXcFlFok44PUEqSlaDL+QWyf4DZ8QIknzJ7eorgNxGjCmmqhtLrDc= root@df" >> /home/git/.ssh/authorized_keys И последний штрих, права доступа, запретим обращаться к ключам и выдадим права на файлы git:
chmod 700/home/git/.ssh/authorized_keys \
chown -hR git:git /home/git/Репозиторий создадим одной командой! Или почти одной:
mkdir -p /srv/git/proj.git \
git init --bare /srv/git/proj.git
Отлично! Теперь репозиторий создан и можно начинать с ним работу, при учете условия того, что он типа bare. О разнице bare и non-bare, вы можете ознакомиться в нашем материале. Тип репозитория в данном случае позволяет обращаться к себе только через pull/push/fetch. Создадим репозиторий на клиенте командой:
git init /путь-к-папке-с-файлами \
git add . \
git commit \
git remote add origin git@ip-адрес-сервера:/srv/git/proj.git
После чего репозиторий будет локально создан на клиенте, файлы зарегистрированы и commit с конечной точкой сервера прописан. И остается загрузить новые данные в репозиторий сервера:
git push origin main Вуаля! Сервер поднят и работает, после чего остальные пользователи смогут загрузить существующий репозиторий командой:

git clone git@ip-адрес-сервера:/srv/git/proj.git Однако не забудьте предварительно прописать их открытые ключи в файле доверенных, как это сделано выше!