Недавно мне надоело заливать проект по ftp. Это неудобно и долго. И я решил воспользоваться системой контроля версий, а именно git. Заодно и контроль версий не помешает. Работаю над ним я один.
Почитав кучу статей и мануалов, попутно пробуя всё это, я пришёл к выводу, что самому мне это не осилить да ещё и в рабочее время.
Прошу помощи. Расскажите, как всё-таки это сделать?
Я так понимаю самый простой и правильный способ, это коммитить, потом делать пуш на сервер, а потом копировать это дело в рабочий каталог.
Авторизацию по ssh по ключам сделал.
Пробовал всё, что предлагают, но так ничего и не получилось.
Всё что мне нужно, это локальный репозиторий, из которого можно делать пуш на удалённый репозиторий на сервере.
1. Создать на сервере репозиторий:
$ ssh servername
$ git init-db --bare myreponame
2. Сделать клон репозитория локально:
$ git clone servername:myreponame
3. Сделать так, чтобы по push в серверный репозиторий автоматически синхронизировался рабочий каталог:
$ ssh servername
$ cd myreponame/hooks
$ cat > update
#!/bin/sh -e
refname="$1"
oldrev="$2"
newrev="$3"
gitdir=`pwd`
if [ "$refname" = «refs/heads/master» ]; then
tmpdir=`mktemp -d`
cd "$tmpdir"
git \
--git-dir="$gitdir" \
archive --format=tar "$newrev" | tar x
rsync -a --delete-after "$tmpdir/" /var/www/что-там-надо/
rm -rf "$tmpdir"
fi
exit 0
4. Не забыть сделать этот скрипт исполняемым:
$ chmod +x update
5. Делаем первый коммит: на локальной машине заходим в репозиторий и делаем:
$ touch test
$ git add test
$ git commit -m 'test' test
$ git push
6. Проверяем что у нас получилось в рабочем каталоге, радуемся жизни
Это да, но никто же не запрещает делать коммит не в рабочую директорию, а например в отдельный каталог, в который можно и сервер настроить на скажем new.domain.com и сразу видеть работает ли оно или нет, а потом это можно перенести в рабочий каталог.
Есть проблема, git archive ставит время изменения всех файлов от времени коммита.
А rsync с опцией -a оперирует временем и размером файлов, в итоге обновляет все файлы в конечной директории, что равносильно сразу распаковать tar в конечную точку.
Что бы правильно работало и обновляло только изменившиеся файлы необходимо заставить rsync оперировать только контентом файлом а именно использовать опцию -с или --checksum.
И вместо gitdir=`pwd` cd "$tmpdir" --git-dir="$gitdir", можно просто указать tar x -C "$tmpdir"
Github предоставляет платные репозитории за довольно небольшую плату, если платить уж совсем не хочется — Bitbucket, любое количество закрытых реп бесплатно, вроде с ограничением количества контрибьюторов.
Да вроде всё понятно. И схема понятна и действия, но почему-то всё выходит не так, как задумывалось. Спасибо, почитаю, попробую. По поводу копирования в рабочий каталог — я прочитал, что гит советует ни в коем случае не делать коммит в рабочую директорию. Оттуда пошло то, что нужно пушить в удалённый репозиторий, а оттуда всякими хуками коммитить в рабочий каталог. Мне хуки не нужны, мне подойдёт и более простой вариант)