Gerrit

From 탱이의 잡동사니
Jump to navigation Jump to search

Overview

git 연동 소스 리뷰 프로그램.

Basic

git 을 형상 관리 시스템이라고 한다면, gerrit 품질 관리 시스템이라고 할 수 있다. git 으로 소스를 업로드하고, gerrit 을 이용하여 소스 리뷰를 하여 소스의 품질을 향상시키는 방식이다.

$ curl -Lo .git/hooks/commit-msg http://review.example.com/tools/hooks/commit-msg

or

$ scp -p -P 29418 pchero@review.example.com:hooks/commit-msg .git/hooks/

Code review

Gerrit 은 기본적으로 코드 리뷰를 하도록 위한 툴이다. 따라서 commit, push 를 할 때에는 code review 를 염두하고 해야 한다. 간단히 말하면, Reviewer 를 배려하자.

  • Commit 은 최대한 작게작게 잘라서 하도록 한다(Reviewer 를 배려하자).
  • 여러번의 Commit 혹은 하나의 Commit 중 하나를 선택해야 하는 경우가 있다. 이는 여러번의 코드 리뷰를 요청하느냐, 한번의 코드 리뷰를 요청하느냐의 문제인데, 이런 경우, 첫번째 항목을 생각하도록 하자.(여러번의 쉬운 코드리뷰를 요청하자)

Commit

$ git commit --amend

Change committed comment

Gerrit 을 이용하기 위해서는 각각의 커밋마다 Change-Id 를 입력해야 한다. PUSH 단위가 아닌 Commit 단위라는 것이 중요한데, 왜냐하면 이 Change-Id 는 push 를 할 때, gerrit 서버에서 임의로 생성해주는 것이기 때문이다. 그런데, 이미 많은 수의 commmit 들이 있는 상황에서 push를 하게 된다면 gerrit 에서는 어떻게 될까? 당연히 에러가 난다.

$ git push origin HEAD:refs/for/develop
...
 ! [remote rejected] HEAD -> refs/for/develop (missing Change-Id in commit message footer)

이럴 경우, 이미 commit 한 각각의 commit 메시지에 Chang-Id 를 입력하고 다시 PUSH 하는 수 밖에 없다.

$ git rebase -i HEAD~2
.. pick up the commit which is having no Change-Id
.. Add the Change-Id at the bottom
...

- Example

<source lang=bash> $ git rebase -i HEAD~2 [detached HEAD 9e9c71c] Added default config values

2 files changed, 22 insertions(+), 2 deletions(-)

Successfully rebased and updated refs/heads/sample_7361.

$ git push origin HEAD:refs/for/develop Counting objects: 22, done. Compressing objects: 100% (15/15), done. Writing objects: 100% (15/15), 2.63 KiB, done. Total 15 (delta 11), reused 0 (delta 0) remote: Resolving deltas: 100% (11/11) remote: Processing changes: new: 2, refs: 2, done remote: remote: New Changes: remote: http://gerrit.test.com:8080/1387 Added default config values remote: http://gerrit.test.com:8080/1388 Added message substitue remote: To ssh://pchero21@gerrit.test.com:29418/services/test

* [new branch]      HEAD -> refs/for/develop

</source>

Push

Gerrit 에서의 Push 일반적인 git push 와는 다르다. 보통은 다음의 문법대로 push 한다.

$ git push origin HEAD:refs/for/<branch>

Revert

Gerrit 에서는 이미 커밋된 소스 내용들에 대해 수정하기는 조금 까다롭다. 커밋된 내용으로 checkout 후에, 소스를 수정하고, 다시 Push 를 해야 한다.

- git checkout <committed ref>
- <Fix the code>
- git push origin HEAD:refs/for/<branch>

Errors

(n/a (unpacker error))

다음과 같은 현상이 있었다.

$ git push origin HEAD:refs/for/master
Counting objects: 2965, done.
Compressing objects: 100% (1672/1672), done.
Writing objects: 100% (2965/2965), 1.15 MiB | 0 bytes/s, done.
Total 2965 (delta 2259), reused 1987 (delta 1286)
remote: Resolving deltas: 100% (2259/2259)
remote: Counting objects: 69209, done
fatal: Unpack error, check server log
error: unpack failed: error Missing blob 9e20600e094296c5ea565b1d0126fc6af0572367
To ssh://gerrit.asterisk.org:29418/asterisk
 ! [remote rejected]       HEAD -> refs/for/master (n/a (unpacker error))
error: failed to push some refs to 'ssh://pchero@gerrit.asterisk.org:29418/asterisk'

구글링 후(https://stackoverflow.com/questions/16586642/git-unpack-error-on-push-to-gerrit), --no-thin 옵션을 넣는 것으로 해결되었다.

$ git push --no-thin origin HEAD:refs/for/master
Counting objects: 2965, done.
Compressing objects: 100% (2153/2153), done.
Writing objects: 100% (2965/2965), 6.12 MiB | 642.00 KiB/s, done.
Total 2965 (delta 1825), reused 1680 (delta 805)
remote: Resolving deltas: 100% (1825/1825)
remote: Processing changes: refs: 1, new: 1, done    
remote: 
remote: SUCCESS
remote: 
remote:   https://gerrit.asterisk.org/c/asterisk/+/14633 stasis_brdige.c: Fixed wrong video_mode shown [NEW]
remote: 
To ssh://gerrit.asterisk.org:29418/asterisk
 * [new branch]            HEAD -> refs/for/master

See also