В общем как то так сложилось что люблю я пользоваться git-ом. Обожаю вести в нем проекты, хранить конфиги. Ну и раз уж появился у меня целый сервер, то грех не организовать на нем удобное хранилище своих репозиториев.
Gitolite позволяет управлять репозиториями, настраивать доступ, в общем практически все что нужно и даже чуточку больше. Подробнее об этом можно глянуть в википедии. Но если в кратце, то gitolite предоставляет доступ к репозиториям посредством ssh, авторизуя пользователей по ключам. С помощью коммитов в специальный репозиторий мы управляем остальными репозиториями. В общем до жути удобно, и максимально просто.
Установка Gitolite
Это очень просто. Для начала создадим специального юзера в системе (допустим server_git), а после от его имени выполняем:
cd ~
git clone git://github.com/sitaramc/gitolite
mkdir -p bin
gitolite/install -to ./bin
После вам нужно закинуть на сервер ваш публичный ssh ключ. Закиньте его в тот же каталог (key.pub), и выполняйте:
./bin/gitolite setup -pk key.pub
Это и все, gitolite установлен. По умолчанию будет создано два репозитория, gitolite-admin.git и testing.git. Первый, как вы уже понимаете — нужен для управления репозиториями. Он будет доступен по адресу:
ssh://server_git@server.com/gitolite-admin.git
(естественно для авторизации нужен приватный пара-ключ для key.pub с которым вы устанавливали gitolite одним шагом назад)
Администрирование Gitolite
Все в принципе очень просто. Клонируем к себе ssh://server_git@server.com/gitolite-admin.git и с помощью коммитов в этот репозиторий управляем доступом/созданием любых репозиториев. Для того чтобы добавить пользователя добавляем в каталог keydir/ публичный ключ этого пользователя. Создание нового репозитория еще проще. Редактируем файл conf/gitolite.conf. Добавляем репозиторий вот так:
repo newrepo
RW+ = user_first
RW+ = user_second
При этом в папке keydir/ должны быть ключи user_first.pub и user_second.pub соответствующих пользователей. Коммитим это все и пушим в репозиторий. После этого на сервере будет создан репозиторий newrepo, к которому будут иметь доступ соответствующие пользователи.
Автодеплой
С этим чуть сложнее. Я опишу как это делал именно я. Не спорю, может быть для этого есть более легкие методы. Но я сделал как смог, и заниматься поисками других вариантов у меня просто не было ни времени ни желания. Многие тащатся от монстров типа capistrano и иже с ним. Но у меня еще не возникало каких то нерешаемых с нынешней системой развертывания dev версий проектов. В продакшн же лью руками.
Вкратце — система построена на хуках, и подтягивания изменений из основного репозитория в репозиторий dev версии. Вобщем глянем на схему:

Всей музыкой руководит приложение (назовем его AutoDeployApp), которое клонирует новый репозиторий если его еще нет (git init и git clone), или подтягивает изменения в существующий (git fetch и git reset) репозиторий Dev версии проекта.
AutoDeployApp
В моем случае это набор простых скриптов (скачать appDeploy). Распаковываем в ~/projects/. Открываем ~/projects/config.php и правим, в моем случае конфиг выглядит вот так:
define('CONFIG_BASEPATH', '/var/www/server_git/data/');
define('CONFIG_DEFAULT_REPOSITORIES', CONFIG_BASEPATH . 'repositories/'); //gitolite repos
define('CONFIG_DEFAULT_CONTENTS', CONFIG_BASEPATH . 'www/git.intsystem.org/'); //path to live versions
define('CONFIG_REMOTE_REPO', 'ssh://server_git@server-git-local/');
Где ssh://server_git@server-git-local/ адрес сервера с gitolite. Т.к. хук обновляет репозиторий через SSH, осуществляя подключение к самому себе же, я просто создал алиас server-git-local в ~/.ssh/config в таком виде:
Host server-git-local HostName git.intsystem.org User server_git StrictHostKeyChecking no IdentityFile ~/.ssh/server_git
При этом нужно сгенерировать пару приватный/публичный ключ (~/.ssh/server_git и ~/.ssh/server_git.pub) с помощью команды ssh-keygen (надеюсь с этим вы справитесь).
Теперь в репозиторий ssh://server_git@server.com/gitolite-admin.git нужно закинуть ~/.ssh/server_git.pub, и для каждого репозитория добавлять RW+ = server_git, в качестве примера:
repo testing
RW+ = insys
RW+ = server_git
Хук в Gitolite
Добавляем хук в ~/.gitolite/hooks/common/post-receive следующего содержания:
#!/bin/bash CURRENT_DIR=`pwd` /var/www/server_git/data/projects/hook_git.php "$CURRENT_DIR" "$GL_REPO_BASE" "$GL_REPO" >> /var/www/server_dev/data/projects/log.txt 2>&1 exit 0
Теперь на каждый пуш новых коммитов будет вызываться данный хук. И при необходимости обновлять dev версию проекта.
Конфиг вебсервера
В панели ISP есть такая замечательная функция которая называется автоподдомены. Суть данной настройки заключается в том что любой каталог расположенный в корневой папке, становится доступен в виде поддомена. Вот пример конфига апача:
... ServerName git.intsystem.org ServerAlias *.git.intsystem.org VirtualDocumentRoot /var/www/server_git/data/www/git.intsystem.org/%1 ...
Создаем новый репозиторий с dev версией
Для начала создаем новый репозиторий в gitolite:
repo testproject
RW+ = user
RW+ = server_git
Добавляем проект в AutoDeployApp, открываем файл ~/projects/projects.txt, добавляем новый проект:
testproject:testproject:testproject
Создаем новый поддомен для dev версии, создаем каталог ~/www/git.intsystem.org/testproject/.
Теперь любой пуш в ssh://server_git@server.com/testproject.git будет сразу виден по адресу testproject.git.intsystem.org
Немного о production
Идея автоматического применения изменения в продакшн мне не очень нравится, но и каждый раз лазить на сервер через ssh чтобы сделать git pull тоже надоедает. Для этого у меня есть простенький скриптик helper-git. Имеет простейший функционал:

Доступ запаролен (helper-git.php?pass=[pass]), смотрим сам файл
define('ACCESS_PASSWORD', 'doe2njkle');
С виду хоть и выглядит топорно и отчасти по-ламерски, но меня вполне устраивает.
Итог
Итого имеем 4 репозитория на каждый проект:
- Локальный.
- Основной (в который пушим из локального).
- Dev-репозиторий (в него автоматом подтягиваются изменения из основного по хукам).
- Продакшн (в него ручками).
Кое-где можно было бы автоматизировать и упростить, но желания этим заниматься у меня нет, ибо проекты я создаю очень редко, а текущая организация системы меня вполне устраивает.
Ну в общем вот как то так. Да может не совсем понятно объяснил, но, честно сказать, я сам иногда перестаю понимать как это все работает :)

Вам бы ~/projects/projects.txt закинуть бы в gitolite-admin репозиторий, что бы не лазить каждый раз на сервер, было бы удобнее наверное
Я думал над этим, смутило то что я не знаю как отнесется сам Gitolite к левым файлам в этом репозитории, хотел проверить, но как то руки не дошли)
Зря переживаете, я так делал, ничего страшного не происходит)
Окей, спасибо за подсказку :)