Gerrit: Difference between revisions
(Created page with "== Overview == git 연동 소스 리뷰 프로그램. == Basic == git 을 형상 관리 시스템이라고 한다면, gerrit 품질 관리 시스템이라고 할 수 있다....") |
No edit summary |
||
(10 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
git 을 형상 관리 시스템이라고 한다면, gerrit 품질 관리 시스템이라고 할 수 있다. git 으로 소스를 업로드하고, gerrit 을 이용하여 소스 리뷰를 하여 소스의 품질을 향상시키는 방식이다. | git 을 형상 관리 시스템이라고 한다면, gerrit 품질 관리 시스템이라고 할 수 있다. git 으로 소스를 업로드하고, gerrit 을 이용하여 소스 리뷰를 하여 소스의 품질을 향상시키는 방식이다. | ||
<pre> | |||
$ 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/ | |||
</pre> | |||
=== Code review === | |||
Gerrit 은 기본적으로 코드 리뷰를 하도록 위한 툴이다. 따라서 commit, push 를 할 때에는 code review 를 염두하고 해야 한다. 간단히 말하면, Reviewer 를 배려하자. | |||
* Commit 은 최대한 작게작게 잘라서 하도록 한다(Reviewer 를 배려하자). | |||
* 여러번의 Commit 혹은 하나의 Commit 중 하나를 선택해야 하는 경우가 있다. 이는 여러번의 코드 리뷰를 요청하느냐, 한번의 코드 리뷰를 요청하느냐의 문제인데, 이런 경우, 첫번째 항목을 생각하도록 하자.(여러번의 쉬운 코드리뷰를 요청하자) | |||
== Commit == | |||
<pre> | |||
$ git commit --amend | |||
</pre> | |||
=== Change committed comment === | |||
Gerrit 을 이용하기 위해서는 각각의 커밋마다 Change-Id 를 입력해야 한다. PUSH 단위가 아닌 Commit 단위라는 것이 중요한데, 왜냐하면 이 Change-Id 는 push 를 할 때, gerrit 서버에서 임의로 생성해주는 것이기 때문이다. 그런데, 이미 많은 수의 commmit 들이 있는 상황에서 push를 하게 된다면 gerrit 에서는 어떻게 될까? 당연히 에러가 난다. | |||
<pre> | |||
$ git push origin HEAD:refs/for/develop | |||
... | |||
! [remote rejected] HEAD -> refs/for/develop (missing Change-Id in commit message footer) | |||
</pre> | |||
이럴 경우, 이미 commit 한 각각의 commit 메시지에 Chang-Id 를 입력하고 다시 PUSH 하는 수 밖에 없다. | |||
<pre> | |||
$ git rebase -i HEAD~2 | |||
.. pick up the commit which is having no Change-Id | |||
.. Add the Change-Id at the bottom | |||
... | |||
</pre> | |||
- 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 한다. | |||
<pre> | |||
$ git push origin HEAD:refs/for/<branch> | |||
</pre> | |||
== Revert == | |||
Gerrit 에서는 이미 커밋된 소스 내용들에 대해 수정하기는 조금 까다롭다. 커밋된 내용으로 checkout 후에, 소스를 수정하고, 다시 Push 를 해야 한다. | |||
<pre> | |||
- git checkout <committed ref> | |||
- <Fix the code> | |||
- git push origin HEAD:refs/for/<branch> | |||
</pre> | |||
== Errors == | |||
=== (n/a (unpacker error)) === | |||
다음과 같은 현상이 있었다. | |||
<pre> | |||
$ 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' | |||
</pre> | |||
구글링 후(https://stackoverflow.com/questions/16586642/git-unpack-error-on-push-to-gerrit), --no-thin 옵션을 넣는 것으로 해결되었다. | |||
<pre> | |||
$ 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 | |||
</pre> | |||
== See also == | |||
* https://wiki.asterisk.org/wiki/display/AST/Gerrit+Usage - Gerrit Usage | |||
[[Category:Version control]] |
Latest revision as of 23:21, 10 July 2020
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
- https://wiki.asterisk.org/wiki/display/AST/Gerrit+Usage - Gerrit Usage