GIT을 사용하다 보면 자주 사용하는 명령어 중 하나가 바로 [ git log ]이다.

commit list를 보기 위한 목적도 있지만, 현재 HEAD가 어디에 있는지 브랜치 상황은 어떤지 등도 확인할 수가 있다. 물론 가장 큰 이유는 언제 어떤 commit이 들어왔는지 확인하는 것이다.

문제는 git log 명령에 대한 출력 결과에 정말 다양한 취향이 존재하며, 이를 만족시키기 위해 다양한 옵션과 함께 자유롭게 결과 형식을 꾸밀 수 있는 pretty-format을 지원하고 있다.

많이 아는 사람은 입맛에 맞게 꾸미면 되지만, 일반적인 사용자들은 너무 많은 옵션을 어떻게 사용해야 할지 어렵기만 할 뿐이다.


개인적으로 가장 자주 사용하는 옵션은 아래와 같다.

$ git log --oneline --graph --decorate --all


출력 결과는 아래와 같다. 아래에 표시는 안했지만, 색도 입혀져 있다.

$ git log --oneline --graph --decorate --all
* d664401 (HEAD, master) [create] 4th.txt - abc
* b7b48a2 [modify] 3rd.txt - ghi
| * adbdaa8 (develop) [modify] 2nd.txt - ghi
| * 47b5c9d [modify] 1st.txt - def
|/ 
* afa1140 (origin/master) [modify] 2nd.txt - def
* 1abd2f1 [create] 3rd.txt
* 6546134 [create] 2nd.txt
* 2dc1cad [create] 1st.txt


일반적으로는 위와 같은 출력만으로도 대부분의 상황은 해결이 된다. commit list도 보여주고 있고 브랜치의 모습도 그래프 형식으로 보여주고 있으며 commit comments도 잘 보여주고 있다. 거기에다가 HEAD의 위치나 브랜치의 위치도 잘 보여주고 있다.

하지만, 개인적으로 조금 부족한 부분이 있어서 아쉬움이 좀 남았다. 그래서 이런 저런 방안을 찾던 중 git log에서도 지원을 하고 있는 pretty-format에 대해서 알아보았다.

그러던 중 웹에서 몇 몇 훌륭한 예시들을 보게 되었고, 개인적인 입맛에 맞게 살짝 변형을 해보았다.

$ git log --graph --all --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ad)%C(reset) %C(white)%s%C(reset) %C(bold white)<%an>%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=short
* d664401 - (2013-03-09) [create] 4th.txt - abc <worker> (HEAD, master)
* b7b48a2 - (2013-03-09) [modify] 3rd.txt - ghi <worker>
| * adbdaa8 - (2013-03-09) [modify] 2nd.txt - ghi <worker> (develop)
| * 47b5c9d - (2013-03-09) [modify] 1st.txt - def <worker>
|/ 
* afa1140 - (2013-03-09) [modify] 2nd.txt - def <worker> (origin/master)
* 1abd2f1 - (2013-03-09) [create] 3rd.txt <worker>
* 6546134 - (2013-03-09) [create] 2nd.txt <worker>
* 2dc1cad - (2013-03-09) [create] 1st.txt <worker>


앞에서 사용한 것과 조금 차이가 있다. 일단 날짜가 나오고 commiter 계정 정보도 나온다. 물론 앞에서 사용했던 옵션에서 보여주고 있는 정보들은 여전히 나오고 있다.

그런데, 여전히 문제가 하나 있다. log를 확인하고 싶을 때마다 저 옵션을 계속 입력할 수는 없다. 저걸 외워서 하겠다라는 사람이 있으면 대단한 것이 아니라 무식한 것이다.

그래서 사용할 수 있는 방법이 바로 alias를 활용하는 것이다. 한 번 살펴보자.

$ git config alias.view "log --graph --all --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ad)%C(reset) %C(white)%s%C(reset) %C(bold white)<%an>%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=short"


사용법은 간단하고도 유용하다.

$ git view -5
* d664401 - (2013-03-09) [create] 4th.txt - abc <worker> (HEAD, master)
* b7b48a2 - (2013-03-09) [modify] 3rd.txt - ghi <worker>
| * adbdaa8 - (2013-03-09) [modify] 2nd.txt - ghi <worker> (develop)
| * 47b5c9d - (2013-03-09) [modify] 1st.txt - def <worker>
|/ 
* afa1140 - (2013-03-09) [modify] 2nd.txt - def <worker> (origin/master)


일반 명령어처럼 사용할 수가 있다. 더불어 뒤에 옵션도 추가로 사용할 수 있다.


위 샘플을 가지고 각자 취향에 맞는 log 옵션을 찾아보길 권한다. 정말 한 번 고생을 해 놓으면 정말 편리하다 !!!

반응형

이제는 어느정도 안정화가 된 것으로 보이는 GIT이지만,
아직도 종종 업데이트가 올라온다.

실제 업무에 이러한 도구를 도입할 때에 문제 중 하나가 이러한 업데이트이다.
버전 間 차이점이 많으면 사용 버전끼리의 충돌 이슈가 발생할 수 있기 때문이다.

그래서 실무에서는 사용할 버전을 하나 정해놓고 모두 해당 버전을 사용하게 가이드하곤 한다.

그리고 새로운 버전이 올라오면 해당 버전을 반영할 필요가 있을지 먼저 검증을 하고,
필요한 기능이 있다면 예전 버전과의 호환성 검증을 한 이후에 배포를 해야한다.

 

Git 1.8.1.3 Release Notes =========================  Fixes since v1.8.1.2 --------------------   * The attribute mechanism didn't allow limiting attributes to be    applied to only a single directory itself with "path/" like the    exclude mechanism does.  The fix for this in 1.8.1.2 had    performance degradations.   * Command line completion code was inadvertently made incompatible with    older versions of bash by using a newer array notation.   * Scripts to test bash completion was inherently flaky as it was    affected by whatever random things the user may have on $PATH.   * A fix was added to the build procedure to work around buggy    versions of ccache broke the auto-generation of dependencies, which    unfortunately is still relevant because some people use ancient    distros.   * We used to stuff "user@" and then append what we read from    /etc/mailname to come up with a default e-mail ident, but a bug    lost the "user@" part.   * "git am" did not parse datestamp correctly from Hg generated patch,    when it is run in a locale outside C (or en).   * Attempt to "branch --edit-description" an existing branch, while    being on a detached HEAD, errored out.   * "git cherry-pick" did not replay a root commit to an unborn branch.   * We forgot to close the file descriptor reading from "gpg" output,    killing "git log --show-signature" on a long history.   * "git rebase --preserve-merges" lost empty merges in recent versions    of Git.   * Rebasing the history of superproject with change in the submodule    has been broken since v1.7.12.   * A failure to push due to non-ff while on an unborn branch    dereferenced a NULL pointer when showing an error message.  Also contains various documentation fixes.

 

뭔가 많이 고쳐진 것이면 바람직하게 보여야 하는데... 아직도 고칠 것이 많은가~하는 불안감도 살짝 있다는...

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

commit을 누가 얼마나 했나요?  (0) 2013.03.16
git log 출력 형식 꾸미기  (0) 2013.03.10
Git 명령어 자동 완성 기능 (Source 설치 時)  (0) 2012.08.20
Git's Tag - git tag  (8) 2012.08.10
git blame (-e 옵션)  (0) 2012.07.29

리눅스의 터미널을 사용하다보면 아주 유용한 기능 중 하나가 바로 자동 완성 기능이다.
명령어 일부를 입력하다가 [ tab ] 키를 누르면 나머지 부분을 자동 완성해주면 정말 편하게 사용할 수 있는 것이다.

특히 경로의 디렉토리 또는 파일 이름을 자동 완성해주면 정말, 정말 편하다.

그런데, Git도 자동완성 기능을 사용할 수 있다!!!


     - git source 파일 중에 자동완성을 위한 파일이 존재 한다.
     - 이를 필요한 곳에 복사를 해넣으면 된다.

$ cd /srv/install/git/git-v1.7.11.2/
$ sudo cp ./contrib/completion/git-completion.bash /etc/bash_completion.d/

     - 위와 같이 복사해 넣고 터미널을 다시 실행하면 된다(물론 source 명령어로 읽어들여도 된다).

     - 그러면, [ git che ] 정도만 입력하고 [ tab ] 키를 누르면 그와 관련한 명령어들이 나열된다.
     - 한 두 글자 더 입력하고 [ tab ] 키를 누르면 자동완성 되기도 한다.

     - 옵션 등도 자동으로 안내를 해주고 정말 유용한 기능이다.


이상~!

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

git log 출력 형식 꾸미기  (0) 2013.03.10
Git 1.8.1.3 Release  (0) 2013.02.19
Git's Tag - git tag  (8) 2012.08.10
git blame (-e 옵션)  (0) 2012.07.29
git man  (0) 2012.07.25

오랜만에 git에 대해서 포스팅을 해야하는데,
너무 간만에 하려다보니 감이 돌아오질 않아서 작성하는데 참 오래걸렸다.

(심지어 이미 포스팅한 내용을 중복해서 작성하던 것을 거의 다 작성하고서야 알아서 결국 다 지웠다는 ㅠㅠ)

---[추가]----------------------------------------------------------------------------------------------

어제 후배 한 명이 git tag와 관련하여 물어본 내용이 있는데,
그에 대한 해답을 찾으면서 추가로 알아본 내용에 대해서 여기에 추가를 했습니다~^^ (thanks 열)
-------------------------------------------------------------------------------------------------------

프로젝트를 진행하던 중 배포용 버전을 만들거나 할 때 별도로 표시하고 싶을 때가 있다.
그럴 때 사용하는 것이 바로 Tag 이다.



1. Tag's Type

   - Git에서 제공해주는 Tag 종류는 두 가지가 있다.
      ▷ Lightweight Tag
      ▷ Annotated Tag

   - Lightweight Tag : 특정 commit에 대한 포인터
   - Annotated Tag   : tag를 만든 사람의 이름/이메일, 생성일자, 메세지, 서명 등을 모두 저장

   - 일반적인 경우에는 Lightweight Tag를 사용하는 것을 추천



2. Lightweight Tag

   - 정말 가볍게 편하게 사용할 수 있는 방식이다.
   - 앞에서 말한 바와 같이 특정 commit 시점에 대해서 책갈피를 한 것으로만 여기면 된다.


 $ git tag v0.1

   - Lightweight tag는 그냥 'git tag' 뒤에 이름만 붙여주면 된다.
   - 정말 단순히 특정 commit에 대한 포인터이기 때문에 "git show"로  정보 요청을 하면 commit 정보만 보여준다.

   - 그런데, 지금 시점의 commit에 대해서 tagging을 했는데, 이전 commit에 대해서는 어떻게 해야할까?


 $ git log --pretty=oneline
 $ git tag v0.0.1 51825b

   - 예전 commit을 지칭하기 위해서는 해당 commit의 hash code를 알아야 하니 git log 로 확인을 하자
   - 그리고는 "git tag 태그명" 뒤에 원하는 commit의 hash code를 적어주면 된다.
   - hash code는 다 적어줄 필요 없이 다른 code와 구분될 정도만 적어주면 된다.



3. Annotated Tag

   - 좀 뭔가 있어 보이는, 그러나 좀 무거워 보이는 Annotated Tag에 대해서 살펴보자.


 $ git tag -a v0.2 -m "Annotated tag test"

   - 'lightweight tag'와 다른 점은 [ -a ] 옵션을 붙여야 한다는 것이다.
   - 더불어 [ -m ] 옵션을 이용하여 코멘트도 추가할 수 있다.

   - 현재가 아닌 지난 commit에 대해서 tagging을 하는 방법은 앞의 lightweight tag와 같다.
   - 당연히 [ -a ] 옵션은 추가해야 한다.

   - 이 외에 GPG 키를 적용하는 방법 등도 있지만, 이는 별도의 과제로 남겨놓겠다.
     (절대로 귀찮아서..... 지금 졸려서.... 그러는 것...... 맞다.....^^ 지금 코감기 걸려서 체력도 좀...)



4. Tag Push

   - 여기서 궁금증 하나! 이렇게 tagging을 한 것은 서버로 push가 될까?


   - tagging 작업을 했는데, 'git push'를 하면 아무 것도 올라가지 않는다.
   - 으응 ?!

   - tag 내역을 상위 repository로 넣기 위해서는 별도로 선택해서 push를 해줘야 한다.


 $ git remote
 $ git push origin v0.1

   - 위와 같은 방식으로 지정해서 push를 해주면 쭈우욱 올라간다

   - 그런데, origin 같은 것을 지정하기 귀찮은데... 소스코드는 그냥 [ git push ]를 하면 되는데...


 $ git push v0.2

   - 위와 같이 하면 에러가 발생을 한다. 이 부분은 그냥 시키는 대로 해야한다.

   - 더불어 하나씩 push 하기 번거로워서 몽창 넣고 싶으면 [ git push origin --tags ] 와 같이 사용하면 된다.


간만에 Git 관련 포스팅을 하려니 테스팅 환경도 다시 좀 맞춰야 하고,
흐름도 왠지 끊긴 것 같고, 거기에 코감기로 계속 코를 먹느라 배는 부르고....
내일 주말 출근해야하는데 시간은 1시 30분을 넘어가고 있고........으흐흐흐....

요즘 맨날 핑계만 대는 것 같네요... 제 글을 읽으시는 분들 응원 좀 해주시길... ㅠㅠ



---[추가]----------------------------------------------------------------------------------------------
※ 나중에 추가를 하다보니 스크린샷이 위와 이어지지 않을 수 있습니다. 양해 바랍니다.

5. refs

     - tag를 push하게 되면 remote repository에 어떻게 저장이 될까?
     - 일단, tag를 만들어서 remote repository에 넣어보자.


$ git tag -a 'v0.1' -m 'tag 테스트'
$ git push origin --tags

     - 이렇게 서버로 밀어넣은 tag는 어떤 모습으로 저장이 되어있을까?


     - remote repository 밑의 디렉토리 중 [ refs/tags ] 밑에 차곡차곡 예쁘게 정리되어 파일로 저장이 되어있다.
     - [ refs/tags/v0.1 ]과 같은 모습으로 해쉬값을 갖고 있는 텍스트 파일이 해당 tag의 저장된 모습이다.

 

6. tag 삭제

     - 만들었으면 지우고 싶을 때도 있다.
     - local에서 지우는 것은 다음과 같다.


$ git tag -d v0.1

     - 간단하게 local에 저장된 tag를 삭제할 수 있다.
     - 하지만, 이렇게 local에서 삭제를 했다고 하여도 remote repository에 있는 것을 지우는 것은 아니다.


$ git push origin :tags/v0.1

     - 위와 같이 branch와 같은 방식으로 삭제할 수 있다.




7. tag's hierarchy

     - tag를 계층적으로 관리할 수는 없을까?
     - build를 위한 tag와 release를 위한 tag를 구분해서 예쁘게 정리를 하고 싶다면 디렉토리 구조를 이용하면 된다.


$ git tag build/king.v0.1/20120810
$ git push origin --tags

     - tag 이름을 위와 같이 디렉토리 구조로 명시해버리면 된다.
     - 생긴 것만 디렉토리 구조가 아니다.


     - remote repository에서 tag가 어떻게 저장되어있는지 확인해보면 실제로 디렉토리 구조로 tag가 위치하고 있다.

     - [ refs/tags/build/king.v0.1/20120810 ]

     - build를 위한 tag이고 king.v0.1 버전 중 20120810 빌드넘버의 빌드라는 의미로 관리할 수 있는 것이다.

     - 구글에서도 이와 같은 방법으로 tagging을 하고 있다. 그렇다고 이 방법이 꼭 모든 상황에서 좋은 것은 아니다!!!



8. usage

     - 지금까지 이것 저것 tag와 관련해서 많이 알아보았지만,
     - 이렇게 설정한 tag를 어떻게 사용하면 되는지에 대해서는 알아보지 않았다.


$ git checkout build/king.v0.1/20120810

     - tag를 사용하기 위한 checkout을 하는 방법을 구글링을 해보면 일반적으로 위와 같이 알려준다.
     - [ git checkout 태그명 ]
     - 본래 [ git checkout 브랜치명 ]과 같이 사용하지만, 같은 형식으로 tag도 사용할 수가 있다고 나온다.

     - 그런데, 위 스크린샷을 보면 알겠지만 branch 상황이 묘하게 되어있다.
     - 애초 작업하던 master branch가 아닌 아무 것도 아닌 branch에 위치하고 있는 것이다.


$ git checkout -b 20120810 build/king.v0.1/20120810

     - 위와 같이 새로 branch를 만들어주면서 그 곳에서 지정한 tag의 snapshot으로 작업을 하면 된다.

     - 예전에는 바로 checkout이 되었지만,
     - 최근 버전의 git에서는 별도의 branch를 만들면서 tag를 사용해야 하는 것으로 보인다.

     - 정확한 사실은 모르겠다. 하지만, 제대로 사용하기 위해서는 바로 위와 같이 별도로 branch를 생성하면 된다.


이 정도면 git에서의 tag에 대한 거의 대부분의 내용은 다 나온 것이 아닐까 생각해본다.....^^

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Git 1.8.1.3 Release  (0) 2013.02.19
Git 명령어 자동 완성 기능 (Source 설치 時)  (0) 2012.08.20
git blame (-e 옵션)  (0) 2012.07.29
git man  (0) 2012.07.25
Gitweb + Apache2  (2) 2012.07.16

git으로 소스 관리를 하다보면 가끔(실은 종종 ^^) 책임 추궁을 할 일이 발생한다.

빌드를 했는데 에러가 발생했다면,
그 소스파일의 그 라인을 누가 작성한 것인지 알고 싶어지게 된다.

그래야 그 사람에게 그 에러를 해결하라고 말할 수 있기 때문이다.


개발자 입장에서는 조금 부정적인 느낌이 드는 Work-Flow이고,
마음에 들지 않는 명령어이기도 하다. (blame : ...을 탓하다)


하지만, 분명 필요한 명령이기도 하다.



1. General Use

     - 어느 소스코드의 몇 번째 라인을 누가 작성했는지 알고 싶을 때엔 아래와 같이 명령하면 된다.


$ cd /srv/workspace/myrepo
$ git blame -L 1,1 ./readme.txt

     - myrepo라는 repository에 있는 readme.txt 파일의 11번째 라인을 누가 작업했는지 알려달라는 의미이다.

     - [ -L ] 옵션 뒤에는 알고 싶은 라인의 시작과 끝을 명시해줘야 하는데,
       특정 1줄만 알고 싶을 경우에는 위와 같이 같은 숫자를 적어주면 된다.



2. Advanced Use

     - [ git blame --help ] 명령을 해보면 친절한 설명을 볼 수 있다.
     - 혹여라도 도움말이 나오지 않으면, 아래 포스팅을 참조하면 된다.
          ▷ http://whatwant.tistory.com/458

     - 여기에서 살펴볼 것은 [ -e ] 옵션이다.

     - 필자가 최근에 진행하고 있는 업무 중 하나가
     - 빌드 자동화 시스템에 붙여서 빌드 에러가 발생하는 경우 해당 내용의 작성자를 찾은 다음
     - 해당 개발자에게 메일로 에러 내역을 발송하도록 하고자 하는 것이다.

     - 그러기 위해서는 해당 소스 라인의 개발자의 이메일 주소를 잡아내야하는데,
     - 위 스크린샷에서 보는 바와 같이 기본적으로는 개발자의 이름만 보여준다.

     - 그래서 필요한 것이 [ -e ] 옵션이다.


     - 그런데, [ -e ] 옵션이 없는 경우가 있다.
     - 현재 패키지 설치로 했을 경우가 그렇다.
     - 소스 설치로 했을 경우에는 가뿐하게 [ -e ] 옵션을 사용할 수 있다.


가볍게 여기까지~

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Git 명령어 자동 완성 기능 (Source 설치 時)  (0) 2012.08.20
Git's Tag - git tag  (8) 2012.08.10
git man  (0) 2012.07.25
Gitweb + Apache2  (2) 2012.07.16
Code Review - Gerrit (Install)  (12) 2012.07.07

도움말을 보려고 하는데 다음과 같이 에러가 발생한다면, 다음의 소스코드 설치 과정을 다시 한 번 살펴보기 바란다.


     - [005] Install GIt (in Ubuntu) : http://whatwant.tistory.com/289


이제 [ git blame --help ] 해보면...


짜잔~

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Git's Tag - git tag  (8) 2012.08.10
git blame (-e 옵션)  (0) 2012.07.29
Gitweb + Apache2  (2) 2012.07.16
Code Review - Gerrit (Install)  (12) 2012.07.07
[004] 당신은 Git을 어떻게 읽나요?  (0) 2012.06.28

Nginx 환경에서 gitweb 구동은 아직 성공은 못했다.
누군가 성공하신 분이 계시면 알려주시면 대단히 감사하겠다는....

일단 기본적인 사항에 대해서는 지난 포스팅을 참고하길 바란다.
     - http://whatwant.tistory.com/397


1. Git 준비 (gitweb 준비)

     - Git을 소스코드 설치를 하셨다면 기본적인 준비는 모두 되어있는 것이다.
     - http://whatwant.tistory.com/289



2. Apache2 준비

     - 간단하게 그냥 패키지로 설치하자.

$ sudo apt-get install apache2



3. 경로 정리

     - 개인적인 취향이 반영된 부분이지만... 여하튼 경로를 정리해보자.
     - git 을 소스설치한 경로는 다음과 같다. [ /srv/install/git/git-1.7.11.2 ]

$ cd /srv/www
$ sudo ln -s /srv/install/git/git-1.7.11.2/gitweb ./gitweb.whatwant.com



4. VirtualHost 생성

     - default 사이트는 삭제하고, 포트 변경해서 생성해보자.

$ cd /etc/apache2/sites-available
$ sudo nano ./gitweb

<VirtualHost *:8080>
        ServerAdmin whatwant@whatwant.com

        DocumentRoot /srv/www/gitweb.whatwant.com

        <Directory "/srv/www/gitweb.whatwant.com">

                DirectoryIndex gitweb.cgi
                Allow from all
                AllowOverride all
                Order allow,deny
                Options ExecCGI

                <Files gitweb.cgi>
                        SetHandler cgi-script
                </Files>

                SetEnv  GITWEB_CONFIG  /srv/www/gitweb.conf
        </Directory>

</VirtualHost>

     - 위 설정과 같이 8080 포트로 gitweb을 구동하고자 한다.

$ sudo nano /etc/apache2/ports.conf

NameVirtualHost *:8080
Listen 8080

     - sites 설정을 맞추자

$ cd /etc/apache2/sites-enabled
$ sudo rm -rf ./000-default
$ sudo ln -s ../sites-available/gitweb ./001-gitweb



5. gitweb.conf

     - gitweb 환경설정을 해보자.

$ sudo nano /srv/www/gitweb.conf

$git_temp = "/tmp";

# The directories where your projects are. Must not end with a slash.
$projectroot = "/srv/repositories";

$feature{'blame'}{'default'} = [1];
$feature{'highlight'}{'default'} = [1];



6. gitweb + gitolite

     - 기본적으로 gitolite를 적용한 환경에서 그냥 gitweb을 연결하면 testing.git repository밖에 안보인다.
     - 그래서 별도의 과정을 추가로 진행하여야 한다.

$ sudo usermod -a -G gitolite www-data
$ sudo chown -R git.www-data /srv/repositories
$ sudo chmod -R g+rx /srv/repositories

     - UMASK 기본 값을 변경해야 한다.
     - 이와 관련된 설정 파일은 gitolite를 설치한 repository를 관리하기 위한 계정에 있다.

$ sudo su - git
$ nano ./.gitolite.rc

    #UMASK                       =>  0077,
    UMASK                       =>  0027,


이제 8080 포트로 웹사이트 접속을 하면 된다~!!!

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

git blame (-e 옵션)  (0) 2012.07.29
git man  (0) 2012.07.25
Code Review - Gerrit (Install)  (12) 2012.07.07
[004] 당신은 Git을 어떻게 읽나요?  (0) 2012.06.28
[003] Git의 탄생 비화  (2) 2012.06.26

Git을 사용하게 되면 따라오는 가장 유명한 도구들이 두 가지가 있다.
하나는 앞에서 살펴본 계정 관리를 위한 Gitolite,
다른 하나는 코드 리뷰를 위한 Gerrit 이다.

특징은 Gitolite, Gerrit 두 가지 모두 Git 전용의 도구들이다.

Google에서 사용하고 있는 코드 리뷰 도구라고 해서 Git의 인기와 함께 각광을 받고 있는 Gerrit !!!

"코드 리뷰" 도구 시장에는 아직 세상을 통일한 절대 막강 도구가 마땅히 없다.
야후에서 사용한다고 하여 유명한 "리뷰 보드(Review Board)"가 있지만, Git 지원은 아직 기본적인 수준이다.

현재 현장 분위기는 Git을 사용한다면 코드 리뷰는 당연히 Gerrit을 사용한다고 생각하고 있다.



이번 포스팅을 위해서 몇 일을 날려가며 엄청 고생을 했다.
아무리 생각해도 이런 빈약한 자료들을 가지고도 Gerrit을 셋팅해서 잘 사용하시는 분들은 전부 고수들인가보다.
범인 수준인 필자는 정말 엄청 개고생(?)을 해서야 겨우 Gerrit 화면을 볼 수 있었다.

하지만, 언제나 그렇지만 성공하고나서 보면... 별것도 아닌 수준이었는데....라는 생각이 든다 ^^



1. Ready

     - Gerrit을 사용하기 위해서는 다음의 조건이 필요하다.
          ▷ JDK          : version 1.6 이상
          ▷ Database  : Gerrit 내장 H2, 또는 MySQL, PostgreSQL

     - JDK 설치는 다음의 포스팅으로 따라하면 된다.
     - http://whatwant.tistory.com/438

     - Gerrit 자체도 두 가지 방식으로 다운로드 받을 수 있다.
          ▷ Binary  : Jenkins와 같이 *.war 파일로 다운로드 받을 수 있다.
          ▷ Source : 빌드하여 바이너리로 직접 만들 수 있다. Apache Maven으로 빌드할 수 있다.

     - 좋은건지 나쁜건지 모르겠지만, 버전업이 상당히 빠른 Gerrit이다.
     - 안전성을 올리기 위한 것이라면 그나마 괜찮은데, 기능적인 면까지 많이 바뀌는 버전업이라 부담스럽기도 하다.



2. Download

     - 굳이 빌드를 수행할 필요없이 *.war 파일로 다운로드 받자.



     - 포스팅을 하던 중에 업그레이드가 계속 되어 결국 스크린샷도 새로 만들어야 했다는... ^^



3. PostgreSQL

     - 이 블로그를 계속 봐오신 분들이라면 아시겠지만, 개인적으로 PostgreSQL을 사랑하는 것을 아실것이다!
     - postgresql이 설치되어있지 않은 경우엔, 그냥 [ sudo apt-get install postgresql ] 실행하면 된다.

     - Gerrit을 위한 PostgreSQL 계정과 db를 만들어줘야 한다.


$ sudo su - postgres

$ createuser -A -D -P -E gerrit2
$ createdb -E UTF-8 -O gerrit2 reviewdb

$ exit

     - 위와 같이 깔끔하게 끝~



4. Gerrit User

     - 참고로 Gerrit의 현재 버전은 version 2.4.1 이다. 그래서 그런지 Gerrit도 그냥 부르지 않고, Gerrit2 라고 한다.
     - Gerrit2를 위한 계정을 하나 만들고 그 계정에 모두 맞추자.


$ sudo adduser gerrit2
$ sudo chown gerrit2.gerrit2 ./gerrit-2.4.2.war
$ sudo su gerrit2


     - "gerrit2" 계정을 만들고 gerrit-2.4.1.war 파일을 해당 계정 소유로 만든 후 gerrit2 계정으로 su하자.




5. apache

     - 이번에는 웹서버로 apache로 셋팅을 해보겠다.
     - 나중에 시간이 잠시나면 꼭 nginx 환경에서 다시 해보도록 하겠다.

 

$ sudo apt-get install apache2


     - 설치를 했으면 확인을 하자.


     - Gerrit에서는 웹서버의 proxy 기능을 요구한다.

 

$ sudo apt-get install libapache2-mod-proxy-html


     - apache2의 proxy 모듈을 추가로 설치를 해주고,


$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo service apache2 restart


     - 웹서버 준비는 여기까지 끝~



6. Gerrit Install

     - 이제 준비 작업은 모두 끝났다. 설치를 진행하면 된다.

     - Gerrit의 기본적인 구성은 Jenkins와 같은 *.war 파일 구동방식이다.
     - 차이가 있다면, init 과정이 있다는 점 정도?!

 

$ sudo su gerrit2
$ cd /srv/install/gerrit


     - 설치과정을 진행하기 전에 권한을 맞추기 위한 선행 준비를 먼저 하자.


$ java -jar ./gerrit-2.4.2.war init -d /srv/workspace/gerrit


     - 위에서 명시한 디렉토리는 gerrit2 계정 권한으로 미리 만들어 두었다.

*** Gerrit Code Review 2.4.2
***

Create '/srv/workspace/gerrit' [Y/n]?  (Enter)

*** Git Repositories
***

Location of Git repositories   [git]: repositories

*** SQL Database
***

Database server type           [H2/?]: ?
       Supported options are:
         h2
         postgresql
         mysql
         jdbc
Database server type           [H2/?]: postgresql
Server hostname                [localhost]: (Enter)
Server port                    [(POSTGRESQL default)]: (Enter)
Database name                  [reviewdb]: (Enter)
Database username              [gerrit2]: (Enter)
gerrit2's password             : (passwd)
              confirm password : (passwd)


     - 이어서 계속 진행하자.


*** User Authentication
***

Authentication method          [OPENID/?]: ?
       Supported options are:
         openid
         http
         http_ldap
         client_ssl_cert_ldap
         ldap
         ldap_bind
         custom_extension
         development_become_any_account
Authentication method          [OPENID/?]: http
Get username from custom HTTP header [y/N]? (Enter)
SSO logout URL                 : (Enter)

*** Email Delivery
***

SMTP server hostname           [localhost]: smtp.gmail.com
SMTP server port               [(default)]: 587
SMTP encryption                [NONE/?]: (Enter)
SMTP username                  [gerrit2]:  @gmail.com
   @gmail.com's password  : (passwd)
              confirm password : (passwd)

*** Container Process
***

Run as                         [gerrit2]: (Enter)
Java runtime                   [/usr/local/java/jdk1.7.0_05/jre]: (Enter)
Copy gerrit.war to /srv/workspace/gerrit/bin/gerrit.war [Y/n]? (Enter)
Copying gerrit.war to /srv/workspace/gerrit/bin/gerrit.war


     - 인증 방식은 [ http ]로 정했다.
     - SMTP 설정은 gmail을 활용하기로 정했다. (이메일 주소는 살짝 지웠다 ^^ 다 알겠지만서도...)

 

*** SSH Daemon
***

Listen on address              [*]: (Enter)
Listen on port                 [29418]: (Enter)

Gerrit Code Review is not shipped with Bouncy Castle Crypto v144
  If available, Gerrit can take advantage of features
  in the library, but will also function without it.
Download and install it now [Y/n]?
Downloading http://www.bouncycastle.org/download/bcprov-jdk16-144.jar ... OK
Checksum bcprov-jdk16-144.jar OK
Generating SSH host key ... rsa... dsa... done

*** HTTP Daemon
***

Behind reverse proxy           [y/N]? (Enter)
Use SSL (https://)             [y/N]? (Enter)
Listen on address              [*]: (Enter)
Listen on port                 [8080]: (Enter)

Initialized /srv/workspace/gerrit
Executing /srv/workspace/gerrit/bin/gerrit.sh start
Starting Gerrit Code Review: OK
Waiting for server to start ... OK
Opening browser ...
No protocol specified


     - 나중에 설정 내용은 변경할 수 있으므로 최대한 기본값으로 정했다.

     - 그런데, 마지막 줄이 마음에 걸린다. [ No protocol specified ]




7. Configuration

     - 여기에서 바로 Gerrit이 실행되면 좋겠는데, 몇 가지 더 설정할 것들이 많다.

     - 앞에서도 언급을 했지만, 우리는 Apache의 Proxy를 활용하여 Gerrit을 띄울 것이다.
     - 그리고 Apache의 http authentication을 적용할 것이다.

     - 우선 관리자 계정 하나를 만들어 넣자.

$ sudo su gerrit2
$ htpasswd -c /srv/workspace/gerrit/etc/passwords "admin"


     - 앞의 설치 과정을 통해 만들어진 gerrit site 의 etc 디렉토리에 passwords 파일을 생성하는 것이다.
     - 앞으로 Gerrit 웹페이지는 이 파일을 이용하여 인증을 하게 된다.

     - Apache의 VirtualHost도 설정을 해주자.

$ sudo nano /etc/apache2/sites-available/gerrit2


<VirtualHost *:8081>
        ServerName localhost

        ProxyRequests Off
        ProxyVia Off
        ProxyPreserveHost On

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        <Location /login/>
                AuthType Basic
                AuthName "Gerrit Code Review"
                Require valid-user
                AuthUserFile /srv/workspace/gerrit/etc/passwords
        </Location>

        ProxyPass / http://127.0.0.1:8080/
</VirtualHost>


     - 위에서 각 포트가 중요한데, VirtualHost 에서는 8081 포트를 사용하고
     - Proxy에서는 8080 포트를 사용한다.

     - 추가로 sites-enabled 디렉토리에 동적링크도 만들어주자.

$ cd /etc/apache2/sites-enabled
$ sudo ln -s ../sites-available/gerrit2 ./001-gerrit2


     - 위와 같이 설정을 하였으면 Apache의 port 설정에도 추가해줘야 한다.

$ sudo nano /etc/apache2/ports.conf


NameVirtualHost *:8081
Listen 8081


     - 위와 같이 8081 포트에 대해서 설정을 추가로 적어주면 된다.

     - gerrit 의 설정값도 다시 한 번 살펴봐야 한다.

$ sudo su gerrit2
$ nano /srv/workspace/gerrit2/etc/gerrit.config


[gerrit]
        basePath = repositories
        canonicalWebUrl = http://localhost:8081/

[database]
        type = POSTGRESQL
        hostname = localhost
        database = reviewdb
        username = gerrit2

[auth]
        type = HTTP

[sendemail]
        smtpServer = smtp.gmail.com
        smtpServerPort = 587
        smtpUser =     @gmail.com

[container]
        user = gerrit2
        javaHome = /usr/local/java/jdk1.7.0_05/jre

[sshd]
        listenAddress = *:29418

[httpd]
        listenUrl = proxy-http://127.0.0.1:8080/

[cache]
        directory = cache


     - 위에서 빨간색으로 표시한 부분만 수정, 추가하면 된다.



8. restart

     - 재시작을 한 번 해보자.

$ sudo su gerrit2
$ cd /srv/workspace/gerrit/
$ ./bin/gerrit.sh restart


     - 이제 웹으로 확인을 해보자.


     - [ http://localhost:8081 ] 주소로 접속을 하면 위와 같이 이름과 암호를 물어본다.
     - 앞에서 "htpasswd"로 만든 계정을 이용해서 로그인하면 된다.


     - 드디어 길고 긴 과정을 거쳐서 gerrit의 화면이 나왔다.



9. Sign Out

     - 이렇게 설치를 했는데, 가장 원초적인 문제가 있다. 바로 [ Sign Out ]이 동작하지를 않는다.

     - 앞에서 [ gerrit.conf ] 파일을 수정할 때 넣은 [ canonicalWebUrl = http://localhost:8081/ ] 때문에 발생했다.
     - 하지만, 그 부분을 없애면 기본적인 동작도 하지 않는다.

     - 이 부분에 대한 해결책은 아직 찾지 못했다.
     - 찾게 되는 즉시 업데이트하도록 하겠다.

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

git man  (0) 2012.07.25
Gitweb + Apache2  (2) 2012.07.16
[004] 당신은 Git을 어떻게 읽나요?  (0) 2012.06.28
[003] Git의 탄생 비화  (2) 2012.06.26
[002] 분산 버전 관리 시스템 (Distributed Version Control System, DVCS)  (0) 2012.06.25

+ Recent posts