티스토리 뷰

웹프로그래밍

Git 이용 웹사이트 Deploy

공허공자 2015. 1. 2. 14:28

http://toroid.org/ams/git-website-howto

필자: Abhijit Menon-Sen <ams@toroid.org>

내 웹사이트 HTML 소스가 내 로컬 작업머신의 Git 저장소에 존재.
이 페이지는 어떻게 "git push web" 명령 실행으로 변경을 설정하는지 기술한다.

온라인 요약: 작업트리에서 분리된 원격 저장소에 push 하고, post-receive hook 에서 "git checkout -f" 실행.

로컬 저장소

$ mkdir website && cd website
$ git init
Initialized empty Git repository in /home/ams/website/.git/
$ echo 'Hello, world!' > index.html
$ git add index.html
$ git commit -q -m "The humble beginnings of my web site."

어쨌든, 어떻게든 도달했다면, 웹사이트 내 변형하고 싶은 내용들 저장소를 가지게 된다.

원격 저장소

다음을 가정한다 the web site will live on a server to which you have ssh access, and that things are set up so that you can ssh to it without having to type a password (예, 공개키가 ~/.ssh/authorized_keys 에 있고 ssh-agent 내부적으로 실행중).

서버에서, 로컬의 미러 저장소를 새로 생성.

$ mkdir website.git && cd website.git
$ git init --bare
Initialized empty Git repository in /home/ams/website.git/

그 후 웹서버의 DocumentRoot (존재하는 디렉토리여야 함; Git이 생성해주지는 않음) 내 최종 트리를 체크아웃하는 post-receive hook 정의 (하고 실행설정):

$ mkdir /var/www/www.example.org
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
$ chmod +x hooks/post-receive

주: 이 하우투의 이전버젼은 다음의 git config 변수 설정에 의존 : core.worktree를 디상 디렉토리로, core.bare 를 false 로, receive.denycurrentbranch 를 ignore 로. 허나 GIT_WORK_TREE (하우투를 처음 썼을땐 동작하지 않았던곳) 사용한다면 이런 변경들은 필요없고 원격저장소엔 bare 가 남아 있을 수 있다.


윈도우의 경우 git bash 에서 c: 는 /c/ 로 표현되므로

예를들어본다면 /c/www/www.example.org 로 입력하면 됨.

작업머신으로 돌아가서, 원격 미러 이름 정의 > 그것을 미러링 > 거기에 새 "master" 브랜치 생성.

$ git remote add web ssh://server.example.org/home/ams/website.git
$ git push web +master:refs/heads/master

서버에서, 이제 어떠한.git 메타데이터와도 독립적으로 /var/www/www.example.org 에 파일복제본들을 가지고 있어야 함.

업데이트 처리과정

간단. 로컬 저장소에서, 다음을 실행

$ git push web

원격 저장소에 새 커밋을 전송할것이며, post-receive hook 에서 즉시 DocumentRoot 를 업데이트 할것임.

(서버에서 원격 작업머신으로 정의하고, 수동이나 cron job 으로 "git pull" 실행하는것보다 손쉽고, 작업머신에 ssh로 접속되도록 하는 따위가 필요치 않다.)

노트

몇가지 더 언급할것들.

우선, 작업트리 (/var/www/www.example.org 위에) 는 훅을 실행하는 사용자로부터 쓰여져야 한다 (또는 git checkout -f 접근에 sudo 가 필요하거나 비스므리한).

또한, 작업트리가 정확히 DocumentRoot 일 필요는 없다. Your repository may represent only a subdirectory of it, or even contain it as a subdirectory.

In the work tree, you will need to set the environment variable GIT_DIR to the path to website.git before you can run any git commands (e.g. "git status").

Setting receive.denycurrentbranch to "ignore" on the server eliminates a warning issued by recent versions of git when you push an update to a checked-out branch on the server. (Thanks to Miklos Vajna for pointing this out.)

You can push to more than one remote repository by adding more URLs under the [remote "web"] section in your .git/config.

[remote "web"]
    url = ssh://server.example.org/home/ams/website.git
    url = ssh://other.example.org/home/foo/website.git

There are also other hooks. See githooks(5) for details. For example, you could usepre-receive to accept or deny a push based on the results of an HTML validator. Or you could do more work in the post-receive hook (such as send email to co-maintainers; see contrib/hooks/post-receive-email).

I wrote this after reading Daniel Miessler's piece on Using Git to maintain your website. He pushes to a bare repository on the server and pulls changes into a second clone that is used as the DocumentRoot. My implementation has fewer moving parts, and keeps .git separate from the DocumentRoot.

Note: some people have reported that this strategy doesn't work under git 1.5.4.3 (because the git checkout -f fails). I know it does work with 1.6.x. I haven't investigated further.

댓글