Про настроку git-сервера на основе gitolite

Создание репозитория:

1.На локальной машине нужно сгенерировать ключ с помощью команды:

$ ssh-keygen -t rsa

Затем полученный ключ (~/.ssh/id_rsa.pub) закинуть на сервер где будет установлен гит (допустим сюда /tmp/user.pub)

2. заходим на сервер через ssh и на сервере устанавливаем гит и гитулайт.

sudo apt-get install git gitolite

3. создаем пользователя gitolite

$ sudo useradd -m gitolite

и переключаемся на пользователя gitolite

$ sudo su gitolite

4. произведем настройку gitolite выполнив команду:

$ gl-setup /tmp/user.pub

При этом откроется редактор. Нужно просто выйти из него набрав :x для сохранения и выхода из редактора. Выйти из под пользователя gitolite.

Настройка сервера при этом завершена.

5. На локальной машине получим репозитарий gitolite-admin (не какой авторизации и ввода пароля при выполнении этой операции не требуется. Если происходит запрос авторизации значит неверно передан ключ в gitolite)

git clone gitolite@198.191.236.199:gitolite-admin.git
Cloning into 'gitolite-admin'... 
remote: Counting objects: 6, done. 
remote: Compressing objects: 100% (4/4), done. 
Receiving objects: 100% (6/6), done. 
remote: Total 6 (delta 0), reused 0 (delta 0) 

gitolite-admin содержит две папки:
Директория keys — это файлы ключами пользователей репозитория.
Директория conf это файлы конфигурации gitolite.

Нас интересует conf/gitolite.conf:

repo    gitolite-admin
        RW+     =   admin

repo    testing
        RW+     =   @all

Содержимое этого файла означает что на гит-сервере создано два репозитория: gitolite-admin и testing.

К репозиторию gitolite-admin доступ на чтение и запись имеет пользователь с ключом сохраненным в файле keys/user.pub.
К репозиторию testing доступ на чтение и запись имеют все пользователи.

6. Добавим новый репозиторий изменив файл conf/gitolite.conf следующим образом:

repo    gitolite-admin 
        RW+     =   user 

repo    testing 
        RW+     =   @all 

repo    boot_ctrl 
        RW+     =   @all 

После этого следует сохранить изменения (commit) и выполнить операцию (push) для отправки изменений на сервер:

$ git commit -am 'Add new project'
$ git push origin master

После этого можно проверить себя выполнив команду, которая покажет список репозитариев на гит-сервере:

ssh gitolite@198.191.236.199 info 
hello user, this is gitolite 2.2-1 (Debian) running on git 1.7.9.5 
the gitolite config gives you the following access: 
    @R_ @W_	boot_ctrl 
     R   W 	gitolite-admin 
    @R_ @W_	testing 

Также можно подключить к серверу по ssh и просмотреть список репозиторием через команду ls

$ ssh gore_user@198.191.236.199
sudo ls -l /home/gitolite/repositories/ 
итого 12 
drwx------ 7 gitolite gitolite 4096 июля   7 15:38 boot_ctrl.git 
drwx------ 8 gitolite gitolite 4096 июля   7 15:38 gitolite-admin.git 
drwx------ 7 gitolite gitolite 4096 июля   7 15:38 testing.git 

7. Новый проект создан, но при этом он пуст.

 

Как добавить данные в созданный репозиторий gitolite:

На локальной машине инициализируем репозиторий git стандартной командой в папке с исходным кодом проекта:

$ git init

Связываем локальный репозиторий с сервером:

$ git remote add origin gitolite@198.191.236.199:boot_ctrl.git

либо клонируем пустой репозиторий, а потом в него добавляем проект:

$ git clone gitolite@198.191.236.199:boot_ctrl.git

После этого добавляем файлы (add), сохраняем данные (commit) и отправляем изменения на сервер (push)

$ git add .
$ git commit -am "Initial commit"
$ git push origin master

Для синхронизации локальной копии с сервером gitolite можно использовать команду:

git pull origin master
 

Для удаления репозитория из gitolite:

1. удаляем репозизиторий из файла conf/gitolite.conf.

2. делаем commit и push.

3. заходим на сервер по ssh и удаляем директорию в /home/gitolite/repositories/ ручками.

 

Для сброса админа в gitolite.

В случае если утерян админский ключ или администрирование осуществляется с другого места следует сбросить админский ключ следующим образом:
1. генерим новый ключ

$ ssh-keygen -t rsa

и закидываем его по ssh на сервер в папочку /tmp. Причем имя нового ключа должно совпадать с именем админа из файла gitolite.conf.

Для примера в файле gitolite.conf:

repo    gitolite-admin 
        RW+     =   super_admin

то и имя файла должно быть /tmp/super_admin.pub
2. выполнить

gl-setup /tmp/super_admin.pub

3. если при выполнении клонирования появляется вот такая ошибка:

$ git clone gitolite@193.191.236.199:gitolite-admin.git 
Cloning into 'gitolite-admin'... 
Agent admitted failure to sign using the key. 

то следует выполнить:

$ ssh-add

и полсле этого повторить клонирование. Должно быть ок.

 

Для публичного доступа через gitweb на сервер gitolite

Движек Gitweb позволяет с помощью браузера получить доступ к серверу gitolite. При этом возможна проблема когда мы заходим на страничку gitweb и не видим списка репозиториев, поэтому требуется донастроить.

1. Файл /etc/gitweb.conf. Следующие поля должны содержать корректный путь до соответствующих файлов/директорий

$projectroot = "/home/gitolite/repositories";
$projects_list = '/home/gitolite/projects.list';

2. Изменить в файле /home/gitolite/.gitolite.rc поле REPO_UMASK

$REPO_UMASK = 0022;

3. изменить права для:

sudo chmod a+r /home/gitolite/projects.list
chmod a+rx /home/gitolite/repositories

4. В файле gitolite-admin/conf/gitolite.conf добавить пользователя gitweb как то так:

repo    testing
        RW+     =   @all
        R       =   gitweb daemon        
        
repo    testing_2
        RW+     =   @all        
        R       =   gitweb daemon   

Создадим новый репозиторий и проверим что он будет виден через gitweb. Для этого откроем в браузере адрес сервера или в локалном случае он будет выглядеть так:

http://127.0.0.1/gitweb

При этом репозитории которые были созданы до применения этих настроек всё равно не будут видны через gitweb, поэтому для них нужно ручками задать права как то так:

chmod -R a+rX /home/gitolite/repositories/testing_1.git
 

Изменение в строке адреса при доступе через gitweb.

По умолчанию доступ к репозитарию с помощью gitweb имеет следующий адрес - http://127.0.0.1/gitweb. В файле /etc/apache2/conf.d/gitweb можно изменить адресную строку, например вот так

Alias /new_repo /usr/share/gitweb

 
  Options +FollowSymLinks +ExecCGI 
  AddHandler cgi-script .cgi 
 

И тогда доступ с помощью gitweb к репозиторию будет по адресу - http://127.0.0.1/new_repo

 

gitweb и добавление категорий.

По умолчанию при просмотре репозитария gitolite через gitweb все проекты представлены одним списком. Если нужно разделить проекты на категории то нужно сделать следующее:

1. В файле .gitolite.rc
строку $GL_GITCONFIG_KEYS привести к виду:

$GL_GITCONFIG_KEYS = ".*";

2. В файле /etc/gitweb.conf добавить поле

$projects_list_group_categories = 1;

3. Файл gitolite-admin/conf/gitolite.conf привести к виду:

repo    alpha/testing_6
        RW+     =   @all        
        R       =   gitweb daemon                        
        config gitweb.category = "Репозитории проекта alpha"        
        
repo    beta/testing_7
        RW+     =   @all        
        R       =   gitweb daemon                                
        config gitweb.category = "Репозитории проекта beta"  
 

Ограничение доступа к серверу gitolite через gitweb.

По умолчанию все пользователи имеют возможность зайти по адресу http://127.0.0.1/gitweb и получить доступ к репозиторию через gitweb. Чтобы добавить ограничение доступа через gitweb нужно:

1. Создать файл .htpasswd в домашней директории /home/gitolite/.htpasswd

2. Привести файл /etc/apache2/conf.d/gitweb к виду

Alias / new_repo /usr/share/gitweb 

 
  Options +FollowSymLinks +ExecCGI 
  AddHandler cgi-script .cgi 
  Options ExecCGI FollowSymLinks Indexes 
  AuthName "git repo" 
  AuthType Basic 
  AuthUserFile /home/gitolite/.htpasswd 
   
    Require valid-user 
   
 

3. Создать пользователя и задать ему пароль:

sudo htpasswd /home/gitolite/.htpasswd UserName
 

Публичный доступ к серверу gitolite с использованием git-daemon.

Настройка доступа к серверу gitolite без авторизации:

1. Создаем файл etc/init.d/git-daemon

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=git-daemon
PIDFILE=/var/run/$NAME.pid
DESC="the git daemon"
DAEMON=/usr/lib/git-core/git-daemon
DAEMON_OPTS="--base-path=/home/gitolite/repositories --verbose --syslog --detach --pid-file=$PIDFILE --user=gitolite --group=nogroup"

test -x $DAEMON || exit 0

[ -r /etc/default/git-daemon ] && . /etc/default/git-daemon

. /lib/lsb/init-functions

start_git() {
  start-stop-daemon --start --quiet --pidfile $PIDFILE \
    --startas $DAEMON -- $DAEMON_OPTS
}

stop_git() {
  start-stop-daemon --stop --quiet --pidfile $PIDFILE
  rm -f $PIDFILE
}

status_git() {
  start-stop-daemon --stop --test --quiet --pidfile $PIDFILE >/dev/null 2>&1
}

case "$1" in
  start)
  log_begin_msg "Starting $DESC"
  start_git
  log_end_msg 0
  ;;
  stop)
  log_begin_msg "Stopping $DESC"
  stop_git
  log_end_msg 0
  ;;
  status)
  log_begin_msg "Testing $DESC: "
  if status_git
  then
    log_success_msg "Running"
    exit 0
  else
    log_failure_msg "Not running"
    exit 1
  fi
  ;;
  restart|force-reload)
  log_begin_msg "Restarting $DESC"
  stop_git
  sleep 1
  start_git
  log_end_msg 0
  ;;
  *)
  echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
  exit 1
  ;;
esac

exit 0

Проверить ключи —base-path,--user на правильность значений (значение ключа —user=gitolite должно браться из ключа --base-path=/home/gitolite/repositories)

2. Запустить git-daemon:

chmod a+x /etc/init.d/git-daemon
/etc/init.d/git-daemon start

3. Добавить пользователя daemon для доступа к требуемому репозиторию в файле gitolite-admin/conf/gitolite.conf

repo    alpha/testing_9
        RW+     =   @all        
        R       =   gitweb daemon                        

4. Получить репозиторий:

git clone git://127.0.0.1/testing_9

либо так:

git clone git://127.0.0.1/testing_9 temp_prj_name
 

Добавление нового пользователя в gitolite

1. Сгенерить ключ на том компьютере откуда будет осуществляться доступ к репозиторию:

$ ssh-keygen -t rsa

и помеместить его в локальный репозиторий gitolite-admin/keydir. Имя ключа будет именем нового пользователя. Для примера: user2.pub

2. Добавить нового пользователя в те репозитории к которым у него должен быть доступ изменяя файл gitolite-admin/conf/gitolite.conf

можно так:

repo    testing_3
        RW+     =   user2

или так:

repo    testing_2
        RW+     =   @all        

или так для получения админских прав:

repo    gitolite-admin
        RW+     =   admin_dima user2

3. Сделать коммит админского репозитория:

git commit -am "add new"
git push origin master

4. Склонировать репозиторий:

git clone git@192.168.0.10:testing_3.git