 |
|
난이도 : 중급 William von Hagen, Systems Administrator, Writer, WordSmiths
원문 게재일 : 2009 년 8 월 25 일 번역 게재일 : 2009 년 10 월 20 일 버전 제어 시스템은 애플리케이션, 웹 사이트 또는 운영 체제를 개발하던지 상관 없이
대부분의 개발 프로젝트의 핵심 구성 요소입니다. 대부분의 프로젝트에는 여러 개발자가 참여하게
되는데 이 경우 각 개발자가 지역적으로 서로 멀리 떨어져 있을 수도 있습니다. 분산 버전 제어
시스템이 새로운 기능은 아니지만 Git 버전 제어 시스템은 개발자 간의 협업 및 상호 작용에 필요한
고유 지원을 제공합니다.
VCS(Version control systems)는 프로젝트의 파일 세트에 대한 변경 사항을 적용 및
관리하는 데 필요한 메커니즘을 제공하며 일반적으로 팀 지향적 소프트웨어, 문서 및 기타
온라인 개발 프로젝트에서 사용된다. VCS는 개발자의 변경 사항이 실수로 다른 개발자의
변경 사항을 덮어쓰게 되는 경우를 방지하면서 여러 사용자가 같은 파일이나 프로젝트에
변경 사항을 제출할 수 있는 환경을 제공하므로 개발 프로젝트에서 시스템 백업만큼이나
중요한 역할을 차지하고 있다.
 |
자주 사용하는 약어
- CSS: Cascading Style Sheet
- GUI: Graphical user interface
- HTML: Hypertext Markup Language
- HTTP: Hypertext Transfer Protocol
|
|
Linus Torvalds가 Linux® 운영 체제 커널을 개발하지 않았다면 아마도 Git VCS를
개발한 인물로 유명해졌을 것이다. Linux처럼 복잡한 프로젝트가 VCS의 궁극적인 시스템
테스트라는 점을 감안하면 Git가 이처럼 빠르게 안정적이고 강력하면서도 유연한 시스템으로
발전하고 있다는 사실은 당연한 결과일 것이다.
Linux 및 UNIX® 시스템은 RCS(Revision Control System), CVS(Concurrent Versions
System) 등의 구 시스템부터 Subversion, Mercurial, Bazaar, Arch, Darcs 등의 최신 시스템에
이르는 다양한 VCS와 깊은 관련을 맺고 있다. 역설적으로(특히 Linux 도메인의 경우), Git는
인상적인 고유 기능과 무료 버전을 제공하는 상업용 VCS인 BitKeeper를 대체하기 위해 개발되었다. BitKeeper는
여전히 인상적이었지만 라이센스 정책이 변경되자 Torvalds는 무료 소프트웨어 전통을 이어갈 수
있는 대안을 찾게 되었으며 결국에는 자신이 직접 작성하기로 결정했다. Linux 커널과 마찬가지로
Git는 성능 개선, 버그 수정을 비롯하여 수없이 많은 오픈 소스 개발자의 헌신적인 노력을 통해
완성된 제품이다.
Git는 강력한 성능을 제공할 뿐만 아니라 무료 소프트웨어로서 비용 절감 효과가 높기
때문에 여러 오픈 소스 소프트웨어 프로젝트, 학술 기관 및 조직에서 급속도로 채택되고
있다. 기업 또는 학계 "내에서" VCS 및 협업을 위한 플랫폼으로 활용할 수 있는 Git의 장점이
알려지면서 기존 "소스 코드" 분야 이외의 여러 프로젝트에서도 Git를 채택하는 경우가 늘어나고
있다. 앞에서 언급한 대로 Git는 컨텐츠 및 개발 요구 사항으로 인해 여러 작업자 간의 최신
상호 작용이 필요한 복잡한 분산 웹 개발 프로젝트에 매우 유용한다.
Git: VCS 이상의 시스템
Git는 다양한 지역에서 다양한 수준의 인터넷 연결을 통해 수천 명의 개발자가
참여하는 분산 개발 작업을 중요한 성능 또는 액세스 병목 현상 없이 지원하기 위해
설계되었다. 이러한 기본 요구 사항을 지원하는 Git의 가장 중요한 특징은 다음과 같다.
- 중앙 저장소를 사용하지만 프로젝트의 각 개발자에게 해당 프로젝트에 대한
전체 소스 코드 복사본을 제공한다. 따라서 모든 개발자가 현재 연결과 상관 없이
작업을 수행할 수 있다.
- 소프트웨어 프로젝트 내에서 다양한 작업 세트를 작성하는 분기 작업과
분기 간에 변경 사항을 공유하는 병합 작업에 필요한 빠르고 안정적인 지원을
제공한다. 분기를 사용하면 영구적 버전이거나 실험용 버전이거나 상관 없이 소프트웨어
패키지의 다양한 버전을 쉽게 지원할 수 있다. 병합은 일반적으로 소스 코드 제어 시스템의
주요 기능으로 특히 분기 지향적 VCS에서 공통적으로 사용된다.
- 변경 사항을 중앙 저장소에 먼저 체크인할 필요 없이 일부 개발자 간에 진행 중 분기 및
코드 변경 사항을 쉽게 공유할 수 있다.
이러한 설계 특징과 구현이 Git의 성공과 유용성을 이끌어낸 핵심 요소이다. 그 뿐만
아니라 Git는 불변성 및 책무성과 같은 표준 VCS 요구 사항도 충족한다. 불변성은 저장소에
커미트된 변경 사항은 프로젝트의 히스토리 레코드에 영구적으로 유지된다는 것을 의미한다. 이후에
변경 사항을 취소(되돌리기)할 수도 있지만 그렇게 되면 변경 사항과 변경 사항을 취소한 대체
코드가 모두 프로젝트 히스토리에 영구적으로 유지된다. 책무성은 특정 변경 사항을 적용한
사용자와 그 시기를 쉽게 파악할 수 있다는 것을 뜻한다. 이 경우 변경한 이유를 알 수는 없지만(이유를
알려면 변경 사항을 커미트할 때마다 간단한 주석이 필요함) 적어도 문의할 수 있는 담당자를 알아낼
수는 있다.
Git에서는 내부 인덱스를 사용하여 저장소에 있는 파일 및 디렉토리의 상태를 추적한다. 또한
이러한 파일 및 디렉토리에 대한 변경 사항이 반영된 오브젝트가 저장되어 있으므로 후속 업데이트를
간편하게 수행할 수 있다. Git의 인덱스 및 오브젝트는 로컬 저장소에 있는 실제 파일 및 디렉토리와는
다른 종류의 모델이다. 즉, 이 모델은 로컬에서만 변경되고 로컬 저장소나 원격 중앙 저장소(있는
경우)에는 아직 커미트되지 않은 파일과 디렉토리를 쉽게 식별할 수 있는 기능을 제공한다. Git 명령 중
일부는 인덱스에 대해 실행되지만 다른 명령은 실제 파일 및 디렉토리 컨텐츠에 대해 실행되므로 잘못된
설명을 사용하면 파일이 업데이트되지 않은 이유를 몰라서 혼란스러울 수 있다.
Git 구하기
대부분의 Linux 배포판에서는 패키지 저장소에 Git용 패키지를 제공한다. .deb 패키지
형식을 사용하는 Ubuntu, Debian 및 유사 시스템의 경우 git-core 패키지를 설치해야
한다. Fedora, Red Hat, Centos, SUSE, Mandriva 등의 RPM 기반 시스템에서는 기본 Git 패키지를
git라고 부른다. 기본 Git 패키지를 사용하려면 Perl과 암호화 및 오류 처리를 위한 Perl
라이브러리가 필요하며 패치 유틸리티도 시스템에 설치되어 있어야 한다.
사용 중인 Linux 시스템에 가장 적합한 최신 버전의 Git가 필요한 사용자를 위해 Git 웹
사이트에서는 미리 패키징되어 있는 .deb 및 RPM 패키지와 최신 Git 소스 코드(직접 고유 버전을
빌드하려는 경우)에 대한 링크와 Mac® OS X, 네이티브 Windows®, Windows 시스템의
Cygwin 및 Sun/Oracle Solaris® 시스템을 위한 미리 컴파일된 버전의 Git에 대한 링크를
제공한다. 하지만 IBM® AIX® 및 Hewlett-Packard® HP-UX 시스템 관리자의 경우에는
해당 플랫폼용 소스 코드를 사용하여 Git를 빌드해야 한다. 플랫폼용 Git를 구하거나 빌드하는
방법에 대한 자세한 정보는 참고자료에서 확인할 수 있다.
기본 Git 패키지에는 git 실행 파일과 몇 가지 보조 Git 애플리케이션이 있다. 예상한
대로 수많은 Git 관련 패키지도 사용할 수 있다. 다음은 가장 유명한 Git 관련 패키지 중 일부이다.
- git-cola. Git 저장소의 파일 및 디렉토리 작업을 위한 GUI이다.
- git-doc. Git 사용자 설명서, 튜토리얼 및 문서를 로컬에 설치한다.
- git-gui. Git 저장소를 탐색하고 저장소 관련 작업을 수행할 수 있는 GUI이며 gitk 패키지를 사용한다.
- git-web. Git 저장소에 대한 웹 기반 그래픽 인터페이스이다.
- gitk. Git 저장소를 탐색하고 저장소 관련 작업을 수행할 수 있는 단순한 GUI이다.
- qgit. Git 저장소를 보고 탐색할 수 있는 Qt 기반 그래픽 애플리케이션이다.
git-gui, git-web, gitk 및 qgit 패키지는 비슷한 기능을 제공하지만 이
중에서 git-web은 웹 기반인 반면 나머지 패키지는 모두 로컬로 실행된다. 이러한
패키지 모두 Git를 처음 시작할 때 유용하게 사용할 수 있지만 아마도 분산 환경에서는 git-web
패키지가 가장 적합할 것이다.
Git를 사용해 보고 싶지만 이미 다른 VCS를 사용하고 있는 경우에는 다음과 같은 패키지를 유용하게 사용할 수 있다.
- git-cvs. Git 및 CVS 저장소 간의 상호 운용성을 제공하는 이 패키지를 사용하면
CVS 저장소와 변경 히스토리를 Git로 가져와서 작업한 후 변경 사항을 CVS 저장소에 다시 병합한
다음 CVS 저장소에서 업데이트를 가져올 수 있다.
- git-svn. Git 및 Subversion 저장소 간의 상호 운용성을 제공하는 이 패키지를 사용하면
Subversion 저장소와 변경 히스토리를 Git로 가져와서 작업한 후 변경 사항을 Subversion 저장소에 다시
병합한 다음 Subversion 저장소에서 업데이트를 가져올 수 있다.
일반 Git 명령
Git는 일반적으로 명령 스위트라고 알려져 있다. 이는 주 명령이 git이고
명령행의 첫 번째 인수가 실행할 특정 Git 명령을 나타낸다는 것을 의미한다.
 |
Git 별칭
또한 기존 버전의 Git에서는 많은 Git 명령에 대한 별칭을 git-command
형식으로 설치했다. 여기서 command는 특정 Git 명령이다. 이 기능을 사용하면 Git
명령을 git push 또는 git-push와
같은 방법으로 실행할 수 있었다. 이 기능은 기본 Git 바이너리에서 제공되던 Git 명령과
외부 Git 명령에 대한 공통 구문을 제공했기 때문에 많은 보조 Git 명령을 개발 중이었던
Git 초기에는 유용했었지만 이제는 Git가 상당 수준 향상되었기 때문에 더 이상 필요하지
않다.
|
|
인수 없이 git 명령을 실행하면 일반 Git 명령 목록을
볼 수 있다. 다음은 이 목록의 일부이다.
add. 새 파일을 Git의 인덱스에 추가한다. 파일의
컨텐츠를 Git 저장소에 실제로 추가하려면 이 파일을 커미트해야 한다.
branch. 체크아웃한 분기를 나열하거나,
현재 작업 중인 분기를 식별하거나, 새 분기를 작성하거나, 작성하거나 체크아웃한
분기의 로컬 사본을 삭제할 수 있다. 이 명령은 다른 분기로 전환되지 않으므로 다른
분기로 전환하려면 Git의 checkout 명령을 사용한다.
checkout. 지정한 분기 또는 파일/디렉토리를
체크아웃한다. 분기를 체크아웃하면 해당 분기가 작업 분기가 된다. 특정 파일 또는 디렉토리를
지정한 경우에는 작업 중인 분기의 저장소에 현재 체크인된 버전과 일치하도록 해당 파일 또는
디렉토리가 업데이트된다. 또한 이 명령을 사용하여 지정된 기존 분기를 기반으로 새 분기를
작성할 수 있으며 선택적으로 지정된 기존 분기에 대한 변경 사항을 추적할 수도 있다.
commit. 파일 및 디렉토리에 대한 변경 사항을
Git의 인덱스에 기록한다. 커미트할 변경 사항이 있는 파일 및 디렉토리를 지정할 때 -a
옵션을 사용하여 Git가 추적 중인 파일에 대한 모든 보류 중인 변경 사항을 추가하거나
--interactive 옵션을 사용하여 함께 커미트하려는 파일 또는
디렉토리 변경 사항을 선택할 수 있다. (두 번째 방법은 많은 수의 파일이 포함된 여러
다양한 작업을 수행하는 중에 특정 변경 사항을 함께 커미트하려는 경우에 매우 유용하다. 커미트는
로컬 저장소에 적용되므로 원격 중앙 저장소를 사용하는 경우에는 Git의 push
명령을 사용하여 로컬 변경 사항을 원격 저장소에 저장해야 한다.)
diff. 로컬 파일과 다른 커미트 간 또는
서로 다른 두 커미트에 있는 파일 간 차이를 표시한다. 이 명령은 주로 파일 이름만을
지정하여 사용되며, 이 경우 지정된 파일과 현재 분기에 있는 저장소에 커미트된 해당
파일 버전의 차이가 표시된다.
fetch. 다른 저장소의 인덱스 업데이트를
검색하여 작성된 새 태그를 식별한 후 해당 저장소에 커미트되었지만 로컬에는 아직
없는 파일 또는 디렉토리 변경 사항에 대한 정보를 제공한다. 그런 다음 git
log 명령을 사용하여 사용 가능한 변경 사항을 검사할 수 있다. fetch 명령을
실행한 후 연관된 파일 변경 사항을 실제로 검색하려는 경우 git
pull 또는 git rebase 명령을 사용할 수 있다.
grep. 현재 분기에 있는 파일에서 패턴이
일치하는 항목을 찾아서 표시한다. 이 명령은 자주 사용되는 대부분의 GNU grep
옵션을 지원한다.
log. 현재 분기 또는 현재 분기에 있는
지정된 파일에 대한 커미트 로그 정보를 보여 준다.
merge. 분기의 변경 사항을 다른 분기에
병합한다. 이 명령에는 병합된 변경 사항을 자동으로 커미트할지 여부를 결정하는 데
도움이 되는 옵션이 있으므로 변경 사항을 실제로 적용하기 전에 이러한 옵션을 통해
병합의 영향을 확인할 수 있다.
mv. Git가 현재 추적하고 있는 파일, 디렉토리
또는 기호 링크의 이름을 바꾼다.
pull. 다른 저장소의 인덱스 업데이트를
가져와서 현재 분기의 파일 및 디렉토리에 병합한다.
push. 로컬 인덱스 및 오브젝트 변경 정보를
사용하여 원격 저장소를 업데이트한다.
rebase. 현재 분기를 원격 분기에 일치하도록
업데이트하고 원격 분기에 저장되지 않은 모든 로컬 커미트를 해당 원격 분기의 현재 상태에
적용할 수 있도록 수정한다. 이 명령은 커미트를 병합할 수 있도록 필요에 따라 글자 그대로
커미트를 다시 쓰기 때문에 강력하지만 위험성을 안고 있는 명령이다. 원격 저장소에 대한
변경 작업의 빈도와 범위에 따라 git pull 명령을 사용하는 것도
좋은 대안이 될 수 있다.
rm. Git가 현재 추적하고 있는 파일, 디렉토리
또는 기호 링크를 제거한다.
stash. 현재 변경 사항을 임시로 스택에
저장한 후 현재 체크아웃을 초기 상태로 되돌린다. git stash save는
현재 변경 사항을 로컬 스택에 저장하는 반면 git stash apply는
로컬 스택에 저장된 변경 사항을 가져와서 다시 적용한다. 이 명령은 진행 중인 변경 사항을
영구적으로 커미트하지 않은 채로 원격 변경 사항을 가져오거나 rebase를 실행하려는 경우에
유용하다.
status. 현재 분기의 상태를 보여 준다. 커미트되지
않은 변경 사항, 추적되지 않고 있는 파일 등에 대한 정보를 확인할 수 있다.
모든 Git 명령에 사용할 수 있는 --help 옵션은 명령에
대한 자세한 정보, 각 명령에 사용할 수 있는 명령행 옵션 목록 등을 보려는 경우에
유용하다. 또한 git help command 명령을 통해서도
Git 명령에 대한 정보를 볼 수 있다.
전체 Git 명령 목록을 보려면 man git 명령을 실행한다.
그러면 Git에 대한 온라인 참조 정보가 표시된다.
새 Git 프로젝트 설정하기
어떤 종류의 개정 제어에도 속해 있지 않은 기존 프로젝트를 사용하여 Git를 시작하려면 다음 단계를 수행한다.
- Change to the directory containing the source code for your project:
$ cd www.move2linux.com
$ ls
greenbar_wide.gif images index.html legacy.html services.html
|
- 다음과 같이
git init 명령을 사용하여 현재 디렉토리에 빈 저장소를 작성한다.
$ git init
Initialized empty Git repository in .git/
|
- 선택적으로,
git status 명령을 사용하여
새 프로젝트의 상태를 확인할 수도 있다. 이 명령을 실행하면 현재
디렉토리의 모든 파일과 디렉토리가 추적되지 않는 항목으로 표시된다. 이는
Git에서 해당 항목의 존재를 인식하고 있기는 하지만 파일을 추적하라는 지시가
없었음을 의미한다.
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# greenbar_wide.gif
# images/
# index.html
# legacy.html
# services.html
nothing added to commit but untracked files present...
|
- 프로젝트의 파일 및 디렉토리를 새 Git 저장소에 추가한다.
파일 및 디렉토리를 명시적으로 나열하거나 다음과 같이 마침표(.)를
"현재 디렉토리의 컨텐츠"를 나타내는 일반적인 단축키로 사용할 수 있다.
git status 명령을 다시 실행하여 현재 디렉토리 및
모든 서브디렉토리에 있는 모든 파일이 새 프로젝트에 추가되었는지 확인한다.
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: greenbar_wide.gif
# new file: images/digits/b/0.gif
# new file: images/digits/b/1.gif
# new file: images/digits/b/4.gif
# new file: images/digits/b/5.gif
# new file: images/digits/b/6.gif
# new file: images/digits/b/7.gif
# new file: images/digits/b/8.gif
# new file: images/digits/b/9.gif
# new file: index.html
# new file: legacy.html
# new file: services.html
#
|
git commit 명령을 실행하여 초기 파일을 체크인한다.
명령행에서 -m "commit message" 옵션을 사용하여
커미트 메시지를 지정하지 않은 채로 이 명령을 실행하면 기본 편집기가 시작된다. 이 편집기에서는
커미트에 연관된 주석을 입력해야 한다. 주석을 저장하고 편집기를 종료하면 Git가 변경 사항과
연관된 파일을 체크인한 후 커미트 및 연관된 파일에 대한 정보를 표시한다.
$ git commit
Created initial commit dfbd6cc: Initial checkin
12 files changed, 285 insertions(+), 0 deletions(-)
...
|
이제 위에서 설명한 명령을 사용하여 Git에서 프로젝트 파일 작업을 수행할 준비가 완료되었다.
 |
중앙 저장소 설정하기
이 섹션의 설명에 따라 저장소를 작성하려면 이 저장소를 사용하여 작업 중인 다른
사용자의 변경 사항을 가져오거나 다른 사용자가 사용자의 분기에 변경 사항을 저장한 후
사용자가 분기를 체크아웃해야 한다. 모든 파일의 작업 사본을 호스팅하지 않는 중앙 저장소를
설정하는 방법에 대한 내용은 Git를 이용한 분산 웹 개발
섹션에서 설명하므로 여기에서는 자세히 다루지 않는다.
|
|
기본 Git 프로젝트에 변경 사항 적용하기
다른 사용자가 이미 작성해 놓은 Git 프로젝트에 변경 사항을 적용하는 방법을
사용하면 훨씬 쉽게 시작할 수 있다. 다음과 같이 git clone
명령을 사용하여 해당 Git 프로젝트의 작업 사본을 작성하기만 하면 된다.
$ git clone /home/jake/src/maps
|
이 예제에서는 현재 작업 디렉토리에 Git 맵 프로젝트의 사본을 작성한다. 그런
다음 디렉토리를 맵 프로젝트의 사본으로 변경한 후 앞에서 설명한 명령을 사용하여
Git에서 해당 프로젝트의 파일에 대한 작업을 시작할 수 있다.
Git 프로젝트 복제하기
다른 시스템에 있는 Git 프로젝트도 간단하게 복제할 수 있다. Git에서는 SSH(Secure
shell) 및 HTTP 프로토콜이 기본적으로 지원되며 원격 시스템에서 Git 데몬이 실행 중인
경우에는 효율성이 높은 git 프로토콜을 사용하여 원하는 프로젝트를 내보낼 수도
있다. Git에서는 SSH가 기본적으로 사용되므로 SSH를 통해 저장소를 복제하는 구문은 예상대로
다음과 같다.
$ git clone remote-machine:/home/jake/src/maps
$ git clone ssh://remote-machine/home/jake/src/maps
|
참고: SSH를 Git 프로젝트를 복제하려면 원격 시스템에 액세스할 수 있는 권한이
있어야 한다. 바로 이 점 때문에 Git 데몬을 실행해야 하는 git 프로토콜을 사용하는
사용자도 있다.
Git를 이용한 분산 웹 개발
위에서 작성한 것과 같은 저장소에는 Git 프로젝트에 있는 모든 파일의 작업 사본과 Git를
사용하여 변경 사항, 분기, 태그 등을 추적할 때 필요한 모든 파일이 들어 있다. 기본적으로
프로젝트에 있는 파일의 작업 사본이 들어 있는 Git 저장소에 저장하게 되면 프로젝트에 있는
실제 파일이 아닌 해당 프로젝트에 대한 인덱스만 업데이트된다. 이는 파일 자체를 업데이트할
때 사용자가 같은 파일에 대한 작업을 수행하고 있으면 병합 충돌이 발생할 수 있기 때문이다.
저장할 수 있는 Git 프로젝트를 작성하려면 베어(bare) 저장소를 작성해야 한다.
이 저장소에는 파일의 작업 사본은 없지만 Git 인덱스, 인덱스에 대한 업데이트를 반영하는
오브젝트 및 Git에 필요한 기타 파일이 들어 있다. 파일의 작업 사본이 없기 때문에 이
저장소에서는 실제 작업을 수행할 수 없다. 단지 이 저장소는 저장소에 포함된 프로젝트에서
작업 중인 모든 개발자에 대한 컬렉션 포인트로서의 역할을 수행한다.
웹 사이트 컨텐츠가 들어 있고 사용자 및 다른 개발자가 컨텐츠를 저장할 수 있는 Git
저장소를 웹 서버에 작성하려면 다음 단계를 수행한다. 이 절차에서는 기존 웹 컨텐츠 디렉토리가
새 Git 저장소의 체크아웃된 버전이 들어 있고 파일이 공유 Git 저장소에 저장될 때마다 자동으로
업데이트되는 디렉토리로 대체된다. 이 작업은 여러 방법으로 수행할 수 있지만 이 예제에서는 쉽게
따라할 수 있도록 웹 사이트의 HTML 컨텐츠에 대한 작업만 수행한다. 웹 사이트의 다른 부분에
대해서도 동일한 원칙에 따라 작업을 수행할 수 있다.
- 웹 서버에서 SSH를 활성화한 후 웹 컨텐츠가 있는 디렉토리로 변경한다.
Git에서 웹 컨텐츠를 아직 추적하고 있지 않은 경우에는 이전
섹션에서 설명한 프로세스에 따라 Git 저장소를 설정한다. 예를 들어, 다음을 수행한다.
$ ssh somehost
$ cd /var/www/html
$ git init
$ git add .
$ git commit -m "Initial commit"
|
- 다음과 같이 한 레벨 위의 디렉토리로 변경한 후 웹 컨텐츠용으로 작성한 프로젝트를
복제하여 베어 Git 저장소를 작성한다.
$ cd ..
$ git clone --bare html html.git
|
.git 확장자를 사용하여 베어 저장소를 작성하는 것이 좋다. 왜냐하면 이 확장자를 요구하는
gitweb와 같은 도구를 통해 저장소를 볼 수 있기 때문이다.
- 기존 웹 디렉토리의 이름을 바꾼 다음 베어 저장소를 복제하여 동일한 이름의 새 Git 프로젝트를
작성한다.
$ mv html html.OLD && git clone html.git html
|
새 프로젝트 디렉토리에는 웹 서버 컨텐츠에 해당하는 Git 프로젝트에 있는 모든
파일의 체크아웃된 버전이 들어 있다.
- 베어 저장소의 hooks 서브디렉토리에서 웹 컨텐츠에 대한 체크아웃된 파일이
들어 있는 새 프로젝트 디렉토리에 변경 사항을 저장하는 post-update 스크립트를 편집(또는
작성)한다.
이 스크립트는 베어 저장소에서 추적 중인 파일이 업데이트된 후 실행된다. 이 스크립트를
실행할 수 있는지 확인한다.
$ pushd html.git/hooks
$ emacs post-update
$ chmod 755 post-update
|
post-update 스크립트의 내용은 Listing 1과 같아야 한다.
Listing 1. post-update 스크립트
#!/bin/bash
#
WEB_DIR="/var/www/html"
export GIT_DIR="$WEB_DIR/.git"
pushd $WEB_DIR > /dev/null
git pull
popd > /dev/null
|
이 스크립트에서는 쉘의 pushd 및 popd
내장 명령을 사용하기 위해 /bin/bash를 인터프리터로 사용해야 한다. post-update
파일이 이미 있는 경우에는 인터프리터를 확인한 후 스크립트의 나머지 부분을 파일에
추가하면 된다. 기존 post-update 스크립트에 있는 기존 명령 앞에 exec
명령이 없는지도 확인해야 한다. 파일에 이 명령이 있으면 이후 행이 실행되지 않기 때문이다.
이제 웹 서버의 베어 저장소를 복제하고 웹 사이트 작업을 시작할 수 있으며 다음과
같은 작업을 통해 웹 사이트를 구성하는 파일에 대한 작업을 다른 개발자와 함께 수행할
수 있다.
- 웹 사이트의 체크아웃에 있는 파일에 대한 작업을 수행한 후 파일을 공유 중앙 저장소에 직접 저장한다.
- 웹 사이트의 체크아웃에 있는 파일에 대한 작업을 수행한 후 공동 작업자에게 체크아웃에서
커미트된 변경 사항을 가져가도록 지시한다. 이렇게 하면 파일을 공유 중앙 저장소와 웹 사이트에
저장하기 전에 파일에 대한 공동 작업을 수행할 수 있다.
Git가 대부분의 VCS에 비해 훨씬 빠르기는 하지만 사용량이 많은 크고 복잡한 사이트 작업을
수행할 경우에는 웹 사이트의 디렉토리에서 직접 작업하는 것을 피해야 한다. 다른 파일이 아직
업데이트되지 않았는데도 일부 파일에 대한 업데이트가 방문자에게 실수로 전송될 수도 있기
때문이다. 이 경우 CSS를 사용하는 업데이트된 페이지가 로드될 때 CSS 업데이트가 아직 수신되지
않았다면 문제가 발생할 수 있다. 업데이트된 컨텐츠를 올리려고 할 때 컨텐츠 디렉토리를
실제로 가리키는 웹 서버의 기호 링크를 전환하는 방법을 사용하거나 웹 서버 구성 파일을
다른 디렉토리를 가리키도록 수정한 다음 새 컨텐츠를 올리려고 할 때 웹 서버를 정상적으로
다시 시작하여 이 문제를 해결할 수 있다.
결론
Git는 설계 목적에 따라 분산되어 있는 사용자들을 위해 많은 협업 기능을 제공하는 강력하고
유연한 VCS이다. Git는 웹 사이트, 웹 기반 애플리케이션 등을 포함한 협업 개발 작업을 새롭고
다양한 방법으로 수행할 수 있는 환경을 제공하므로 Git에 대해 자세히 알아보고 일반적으로
사용되는 Git 명령을 익혀두면 많은 도움이 될 것이다.
참고자료 교육
제품 및 기술 얻기
-
Download Git: Cygwin, Linux, Mac OS X, Solaris 및 Windows용 Git를 다운로드할 수 있다.
-
IBM 시험판 제품을
다운로드하여 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및
미들웨어 제품을 사용하자.
필자소개  | |  | William (Bill) von Hagen은 20년 이상 동안 작가 및 UNIX 시스템 관리자로 활동하고
있으며 1993년부터 열렬한 Linux 지지자이기도 하다. Ubuntu Linux, Xen 가상화, GCC(GNU
Compiler Collection), SUSE Linux, Mac OS X, Linux 파일 시스템, SGML 등의 주제에 관한
서적의 저자 또는 공동 저자이며 Linux 및 Mac OS X 간행물 및 웹 사이트에 수많은 기사를
기고했다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|