Lonely Dreamer (sanmai) wrote,
Lonely Dreamer
sanmai

Categories:

Как разместить сайт с помощью Git: быстрый и простой деплой с помощью Git

Автоматический деплой из 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 на сервере и разрешить конфликты.

Если же вы хотите использовать похожую схему без хуков с ручным обновлением - ознакомьтесь с подводными камнями.
Tags: git, linux, vhosting
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 10 comments