-
1. 시작하기
-
2. Git의 기초
- 2.1 Git 저장소 만들기
- 2.2 수정하고 저장소에 저장하기
- 2.3 커밋 히스토리 조회하기
- 2.4 되돌리기
- 2.5 리모트 저장소
- 2.6 태그
- 2.7 Git Alias
- 2.8 요약
-
3. Git 브랜치
-
4. Git 서버
- 4.1 프로토콜
- 4.2 서버에 Git 설치하기
- 4.3 SSH 공개키 만들기
- 4.4 서버 설정하기
- 4.5 Git 데몬
- 4.6 스마트 HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 또 다른 선택지, 호스팅
- 4.10 요약
-
5. 분산 환경에서의 Git
- 5.1 분산 환경에서의 워크플로
- 5.2 프로젝트에 기여하기
- 5.3 프로젝트 관리하기
- 5.4 요약
-
6. GitHub
- 6.1 계정 만들고 설정하기
- 6.2 GitHub 프로젝트에 기여하기
- 6.3 GitHub 프로젝트 관리하기
- 6.4 Organization 관리하기
- 6.5 GitHub 스크립팅
- 6.6 요약
-
7. Git 도구
- 7.1 리비전 조회하기
- 7.2 대화형 명령
- 7.3 Stashing과 Cleaning
- 7.4 내 작업에 서명하기
- 7.5 검색
- 7.6 히스토리 단장하기
- 7.7 Reset 명확히 알고 가기
- 7.8 고급 Merge
- 7.9 Rerere
- 7.10 Git으로 버그 찾기
- 7.11 서브모듈
- 7.12 Bundle
- 7.13 Replace
- 7.14 Credential 저장소
- 7.15 요약
-
8. Git맞춤
- 8.1 Git 설정하기
- 8.2 Git Attributes
- 8.3 Git Hooks
- 8.4 정책 구현하기
- 8.5 요약
-
9. Git과 여타 버전 관리 시스템
- 9.1 Git: 범용 Client
- 9.2 Git으로 옮기기
- 9.3 요약
-
10. Git의 내부
- 10.1 Plumbing 명령과 Porcelain 명령
- 10.2 Git 개체
- 10.3 Git Refs
- 10.4 Packfile
- 10.5 Refspec
- 10.6 데이터 전송 프로토콜
- 10.7 운영 및 데이터 복구
- 10.8 환경변수
- 10.9 요약
-
A1. 부록 A: 다양한 환경에서 Git 사용하기
- A1.1 GUI
- A1.2 Visual Studio
- A1.3 Eclipse
- A1.4 Bash
- A1.5 Zsh
- A1.6 Git in Powershell
- A1.7 요약
-
A2. 부록 B: 애플리케이션에 Git 넣기
-
A3. 부록 C: Git 명령어
- A3.1 설치와 설정
- A3.2 프로젝트 가져오기와 생성하기
- A3.3 스냅샷 다루기
- A3.4 Branch와 Merge
- A3.5 공유하고 업데이트하기
- A3.6 보기와 비교
- A3.7 Debugging
- A3.8 Patch 하기
- A3.9 Email
- A3.10 다른 버전 관리 시스템
- A3.11 관리
- A3.12 Plumbing 명령어
A2.4 부록 B: 애플리케이션에 Git 넣기 - go-git
go-git
Go 언어로 작성한 서비스에 Git 기능을 통합하려고 한다면 순수하게 Go 언어로만 작성된 라이브러리 구현체가 있다. Go 언어로 작성된 라이브러리기에 네이티브 의존성이 없으며 메모리관리에서 오류가 날 가능성이 적다. 또한 Go 언어로 작성되었기에 Go 표준 성능 측정 도구(CPU, 메모리 프로파일, 경쟁상태 탐지 등)를 사용할 수 있다.
go-git은 확장성과 호환성에 중점을 두며 Plumbing API 대부분을 지원한다. 관련 내용은 https://github.com/src-d/go-git/blob/master/COMPATIBILITY.md 에서 확인할 수 있다.
Go 라이브러리 API를 사용하는 기본적인 예제는 다음과 같다.
import "gopkg.in/src-d/go-git.v4"
r, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{
URL: "https://github.com/src-d/go-git",
Progress: os.Stdout,
})
위 코드를 실행하면 Repository
인스턴스를 할당받게 되고 이 인스턴스를 통해 저장소 정보를 가져오거나 어떤 변화를 줄 수 있다.
// HEAD가 가리키는 브랜치 Ref를 가져오기
ref, err := r.Head()
// Ref가 가리키는 커밋 개체를 가져오기
commit, err := r.CommitObject(ref.Hash())
// 커밋 히스토리 정보를 가져오기
history, err := commit.History()
// 히스토리에서 커밋을 하나씩 반복하여 정보를 출력하기
for _, c := range history {
fmt.Println(c)
}
고급 기능
go-git에 몇 가지 주목할만한 고급 기능이 있다. 하나는 플러그 가능한 저장소 시스템이며 Libgit2의 “Backend” 비슷하다. 기본 구현은 메모리 저장소이기에 접근 속도가 매우 빠를수 밖에 없다.
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
URL: "https://github.com/src-d/go-git",
})
플러그 가능한 저장소는 다양한 재밌는 옵션을 제공한다. 예를 들어 https://github.com/src-d/go-git/tree/master/_examples/storage 내용을 보면 레퍼런스, 개체, 설정정보 등을 Aerospike 데이터베이스에 저장하는 예제를 볼 수 있다.
다른 고급 기능으로는 유연한 파일 시스템 추상화가 있다. https://godoc.org/github.com/src-d/go-billy#Filesystem 문서를 보면 쉽게 파일을 여러가지 다른 방식으로 저장하는 내용을 볼 수 있다. 하나의 큰 파일 덩어리로 처리할 수도 있고 메모리에 모두 적재시킬 수도 있다.
또 다른 고급기능을 사용하는 예제로 세세하게 설정가능한 HTTP 클라이언트를 사용하는 구현을 https://github.com/src-d/go-git/blob/master/_examples/custom_http/main.go 에서 찾아볼 수 있다.
customClient := &http.Client{
Transport: &http.Transport{ // 모든 인증서를 통과시키기
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},
Timeout: 15 * time.Second, // 15초 타임아웃
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse // 리다이렉트 응답을 따라가지 않기
},
}
// 기본 https 클라이언트를 새로 작성한 임의의 클라이언트로 교체하기
client.InstallProtocol("https", githttp.NewClient(customClient))
// 새로 설정한 클라이언트를 사용하여 https 주소로 시작하는 저장소를 Clone 하기
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{URL: url})
더 읽어볼 거리
go-git의 다양한 기능을 모두 다루는 것은 이 책이 담을 수 없는 영역에 있다. go-git에 흥미가 생기고 있다면 냉큼 https://godoc.org/gopkg.in/src-d/go-git.v4 로 가서 API 문서를, https://github.com/src-d/go-git/tree/master/_examples 로 가서 다양한 구현 예제를 찾아보기 바란다.