Previous Entry Share Next Entry
Как разместить сайт с помощью Git: быстрый и простой деплой с помощью Git
Linux
sanmai

Автоматический деплой из Git? Есть ответ!

Легко сделать из Git быструю и удобную замену FTP, rsync или чем вы сейчас пользуетесь для выгрузки исходников на целевой сервер.

Огромный плюс такого подхода: вам не нужны никакие дополнительные действия на сервере кроме настройки хуков Git, которые вызываются при git push.

Забудьте о sudo и мутных шелл-скриптых, которые невозможно сходу понять. Забудьте о безпарольных ssh-ключах для доступа к GitHub и других костылях. Это всё не нужно. Лишь бы у вас на сервере был Git.

Приступим

На целевом сервере создадим пустой репозиторий:

~/www$ git init
Initialized empty Git repository in /home/example.com/www/.git/



( Дальше всё просто )

Разрешим перезапись текущей ветки:
~/www$ git config receive.denyCurrentBranch ignore
Добавим хук который будет делать всю работу:
~/www$ cat > .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
~/www$ chmod +x .git/hooks/post-receive
Теперь расскажем локальному репозитарию об удаленном:
$ git remote add --track master origin ssh://example.com@server.example.net/~/www/
Загрузим основную ветку на целевой сервер:
$ git push --set-upstream origin master
Всё!

В дальнейшем нам достаточно будет делать git push для выгрузки основной ветки на сервер когда нам это будет нужно.
Аналогично можно сделать для любой другой ветки заменив master на ее имя в командах.
Этот же репозитарий можно использовать как и любой другой для коллективной разработки.

Если вам настолько повезло нужно одновременно обновлять некий сайт как через Git, так и другими способами, чтобы загруженные иными способами изменения не пропали при очередном обновлении из-за git reset --hard, вам нужны другие хуки:
~/www$ cat > .git/hooks/pre-receive 
#!/bin/sh
cd ..
GIT_DIR='.git'
git stash save --quiet
git stash show || true
$ cat > .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
git stash pop --quiet || git reset --hard
~/www$ chmod +x .git/hooks/pre-receive .git/hooks/post-receive
В случае конфликтов вам нужно будет вручную сделать git stash pop на сервере и разрешить конфликты.

Если же вы хотите использовать похожую схему без хуков с ручным обновлением - ознакомьтесь с подводными камнями.

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

Если использовать голый репозитарий, то вполне может что-то получиться. В других случаях фото будут занимать примерно в два раза больше места.

Ещё вот: http://www.google.com/search?hl=en&q=git+dropbox

А это позволит таки контролировать версии, или будет просто rsync?

Читайте третье предложение после "всё"
В частности на самом сервере тоже можно коммитить.

Edited at 2011-07-12 06:21 am (UTC)

В вашем варианте, я бы для публикации сделал отдельный сервер publication. И публиковал git push publication master. Особенно если над сайтом работает ресколько человек.
Мы просто тегируем версию сайта, готовую к публикации как publicate. А www-cервер сам вытягивает её либо по крону либо ручками.

Вариантов сделать что-то подобное - множество. Что кому удобней.

Ты попал в новости на опеннет =)

  • 1
?

Log in

No account? Create an account