GIT deployment

… или “нестандартное использование системы управления версиями”.

Возможности GIT выходят за пределы управления версиями. Я использую его в качестве инструмента для развертывания проекта на сервере. Требуется: идентичные настройки среды проекта на рабочей станции (или испытательном стенде) и “боевом” сервере, GIT на клиенте, SSH на сервере и два простеньких скрипта.

Прежде всего создайте GIT-репозиторий в своей рабочей директории и поместите в него исходный код.

git init
git add .
git commit -m "Let there be light!"

Потом создайте GIT-репозиторий на боевом сервере.

ssh user@example.com
cd path/to/site
git init

Затем отредактируйте (там же, в директории проекта на “боевом” сервере) файл .git/hooks/post-receive так, чтобы он был примерно таким:

#!/bin/sh

cd ..
env -i /path-to-git/git reset --hard

… и сделайте его исполнимым.

chmod a+x .git/hooks/post-receive

Путь к git можно узнать, выполнив команду:

whereis git

После этого отключитесь от сервера и в локальной консоли выполните команду:

git push --force ssh://user@example.com/path/to/project/.git master:master

…и ваш локальный проект будет развернут на боевом сервере. А чтобы автоматизировать операцию, создайте исполняемый файл git-deploy.sh c таким содержанием:

#!/bin/bash

git add .
git commit -a --amend --reuse-message=HEAD
git push --force ssh://user@example.com/path/to/project/.git master:master

Каждый раз, когда вы будете выполнять этот файл, все внесенные изменения добавятся к последнему комиту и выгрузятся на сервер. То есть в истории вашего проекта не будет лишних комитов, связанных с выгрузкой на сервер, а будет только история разработки. Все эксперименты можно проводить в параллельных ветках, выгружаться на сервер они будут только после того, как вы “сольете” изменения в ветку master.