2010-12-23

Флешки больше не нужны! или: Использование Git для синхронизации папок

Допустим, у вас есть какой нибудь сервер с доступом по SSH. На сервере стоит git. Мы хотим создать некую папку на удаленном сервере, содержимое которой должно синхронизироваться с локальной папкой на домашнем копьютере а также с локальной папкой на другом компьютере, например на работе.

Начнем с сервера (на нем Ubuntu).

1. если git не стоит установим его:

> sudo apt-get install git-core
> git config --global user.name "Uzumaki Naruto" #расскажем немного о себе
> git config --global user.email naruto@uzumaki.co.jp #свой емайл

2. создадим репозиторий

> cd /path/to/the/folder #переходи в папку которую будем шарить
> git init #создаем репозиторий
> git config receive.denyCurrentBranch ignore #это чтобы можно было заливать изменения

 

3. создаем файл README и добавим его в наш новый репозиторий:

> touch README #создаем пустой файл
> git add README #добавляем его в репозиторий
> git commit -a -m"first commit" #фиксируем изменения

Репозиторий создан. Теперь переходим на наш домашний компьютер. Прежде чем соединяться с удаленным сервером нам нужно залить на удаленный сервер публичный ключ домашнего компьютера чтобы мы могли соединяться с ним без пароля.

> ssh-keygen -t rsa -C"naruto@homeaddress.ru" #создадим ключ если не создан
> cat ~/.ssh/id_rsa.pub | ssh user@remoteserver.com 'cat >> .ssh/authorized_keys' #закинем ключ на удаленный сервер

скачиваем наш репозиторий с удаленного сервера:

> git clone user@remoteserver:/path/to/the/folder

Поздравляю, репозиторий скачан, мы можем отредактировать файл README локально и закачать изменения в репозиторий:

> git status #смотрим что изменилось
> git commit -a -m "local chages" #фиксируем изменения
> git push origin master

Аналогично, можно создать репозиторий на другой машине, например на вашем рабочем компьютере. При этом чтобы скачать изменения на рабочий компьютер достаточно перейти в каталог с репозиторием и вызвать

> git pull #все изменения сделанные дома зальются на рабочий компьютер.

Теперь, если перейти на удаленный компьютер, где лежит оригинальная версия файлов можно заметить, что файловая система удаленного репозитория осталась без изменений, т.е. файл README как был пустой так и остался, вызываем волшебную команду:

> git reset --hard

Проверям, содержимое файла README теперь такое же как и на нашей домашней машине, как и на рабочей машине.

Таким образом, мы получили несколько репозиториев связанных между собой через один удаленный репозиторий. Причем, система полностью децентрализованна - потеря одного репозитория ничем нам не грозит, всегда можно восстановить удаленный репозиторий используя один из локальных, в отличии от, скажем, SVN.

Несколько замечаний.

1. для доступа к удаленному репозиторию по идее git не обязателено устанавливать на удаленной машине достаточно иметь к ней доступ по SSH - просто скопировать локально созданный репозиторий на удаленную машину, но в этом случае мы не сможем видеть изменения на удаленном сервере в виде живых файлов.

2. в примере используется SSH авторизация, если нужно чтобы к репозиторию обращалось несколько человек имеет смысл использовать gitosis см: https://help.ubuntu.com/community/Git

 

комментарии:

 
anloc (анонимный пользователь) | 2012-07-04

после изменений на локальной машине push не получается сделать, получается ошибка

 refusing to update checked out branch: refs/heads/master
 By default, updating the current branch in a non-bare repository
 is denied, because it will make the index and work tree inconsist
 with what you pushed, and will require 'git reset --hard' to matc
 the work tree to HEAD.
 You can set 'receive.denyCurrentBranch' configuration variable to
 'ignore' or 'warn' in the remote repository to allow pushing into
 its current branch; however, this is not recommended unless you
 arranged to update its work tree to match what you pushed in some
 other way.
 To squelch this message and still keep the default behaviour, set
 'receive.denyCurrentBranch' configuration variable to 'refuse'.

anloc (анонимный пользователь) | 2012-07-04

решение здесь нашел http://jenyay.net/Programming/Git

max | 2012-07-04

Да, точно, про это я забыл написать, исправлю...

ном (анонимный пользователь) | 2012-09-04

И когда же напишите про изменения? Народ уже читает и сталкивается с такими проблемами

max | 2012-09-04

а я написал в пункте 2:

> git config receive.denyCurrentBranch ignore #это чтобы можно было заливать изменения

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

Имя*

разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться