Совместная работа над проектом включает множество корпоративных инструментов и платформ. Для накопления знаний и документации – Wiki платформа, для управления рабочими процессами CRM, для управления и доступа к данным – базы данных и т.д. Однако важным компонентом, при работе с кодом, документацией, а так же файлами остается Git!
Что такое Git?
Git – это система контроля версий репозитория, которая представляет собой платформу для управления репозиториями хранимых на сервере. Используется в основном для распространения ПО для неопределенного круга лиц или же предоставления доступа для совместной работы команды над проектом. Для начала определимся с понятиями и сущностями, которые используются, при работе с Git:
- Working tree (Рабочая директория) – папка, в которой хранятся файлы для работы пользователей и директория .git;
- Index (Индекс) – промежуточный модуль, который хранит изменения Working tree;
- Commit (Снимок директории) – снимок рабочей директории с учетом изменений записанных в Index;
- Repository (Репозиторий)- архив из commit или же снимков рабочей директории.
Всю работу с репозиториями можно представить в виде схемы из трех сущностей:
Работа пользователя начинается с инициализации репозитория в определенную папку командой:
После чего создаются три основные сущности для работы Git: Working Tree, Index, Repository. Папка, в которой создана директория .git считается Working Tree и именно в ней хранятся файлы. Все изменения внесенные в рабочую директорию регистрируются в Index командой:
Изменения Working Tree зарегистрировались, после чего можно сформировать Commit или же снимок рабочей директории, который направится в репозиторий.
На сейчас сформирован commit в виде объекта, который хранится в объектах. Далее мы можем направит в локальный репозиторий, по умолчанию командой:
Где origin-путь, а master-главная ветка. Либо переопределить путь origin на удаленный репозиторий и выполнить команду:
После чего Commit будет отправлен в хранилище или же Repository, где на зарегистрирует commit под названием master. В дальнейшем, любой пользователь сможет скачать себе эту версию commit и использовать ее у себя локально. Реализуется командой:
А как это применить на практике? Поднимем свой Git-сервер!
Как быстро создать свой Git сервер?
Все действия были выполнены в среде облачного сервера от Serverspace, для этого перейдем к созданию сервера, на любой из двух платформ vStack cloud или же VMware cloud. Нажмем на кнопку Создать сервер и выберем конфигурацию, подходящую под наши задачи, затем нажмем кнопку Создать:
Установим на машине пакет git через команду, для deb-подобных дистрибутивов:
И отдельная команда для rpm-подобных версий, через менеджер пакетов yam/dnf:
Для аутентификации на сервере будет работать SSH под пользователем git и проводить авторизацию через ключи. Чтобы пользователь не мог выполнить вредоносные команды в обычную оболочку необходимо будет указать для него git-shell, через который можно выполнить только команды git. Для этого создадим пользователя 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:
Скопируйте отобразившийся ключ, он должен выглядеть следующим образом:
Для защиты устройства от обращения к другим серверам – добавим в начало строки no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty и получим следующую запись и сразу запишем в авторизованные ключи. Не забудьте перейти обратно на сервер, ведь именно там мы вставляем ключ клиента:
И последний штрих, права доступа, запретим обращаться к ключам и выдадим права на файлы git:
chown -hR git:git /home/git/
Репозиторий создадим одной командой! Или почти одной:
git init --bare /srv/git/proj.git
Отлично! Теперь репозиторий создан и можно начинать с ним работу, при учете условия того, что он типа bare. О разнице bare и non-bare, вы можете ознакомиться в нашем материале. Тип репозитория в данном случае позволяет обращаться к себе только через pull/push/fetch. Создадим репозиторий на клиенте командой:
git add . \
git commit \
git remote add origin git@ip-адрес-сервера:/srv/git/proj.git
После чего репозиторий будет локально создан на клиенте, файлы зарегистрированы и commit с конечной точкой сервера прописан. И остается загрузить новые данные в репозиторий сервера:
Вуаля! Сервер поднят и работает, после чего остальные пользователи смогут загрузить существующий репозиторий командой:
Однако не забудьте предварительно прописать их открытые ключи в файле доверенных, как это сделано выше!