hello #git notes

2 minute read

note

git notes는 또 뭐람? 커밋 메시지만 잘 남기면 되지. 이게 필요할까?

git notes를 어떻게 저장하는가

git 객체는 persistent data structure 노드다.

그래서 수정할 수 없다. 새로 만들어서 링크할 뿐 노드를 수정하는 동작은 없다. 살짝 수정할 것 같은 amend도 사실 커밋 객체를 새로 만드는 명령이다.

커밋 아이디를 변경안하고 그 커밋에 정보를 추가할 수 있다면? 이게 바로 git notes다.

nil

git notes는 커밋 객체를 생성한다. 커밋 객체답게 트리 객체도 가지고 있다. 여기서 트리 객체 file 이 커밋 ID인 게 특이하다. 노트 내용은 blob 으로 저장.

refspec을 추가해야 가져오지

# .git/config
[remote "origin"]
  fetch =  +refs/notes/*:refs/notes/*

따로 정의하지 않으면 notes는 안 가져온다. fetch 할 때, notes도 같이 가져오도록 refspec을 추가한다. 보기만 하지 쓸 일은 없으니 fetch 에만 추가했다.

어떻게 쓰면 잘 썼다 소문이 날까?

Notes (review):
    Code-Review+2: Alex Blewitt
    Verified+1: Jenkins
    Submitted-by: Alex Blewitt
    Submitted-at: Thu, 20 Oct 2011 20:11:16 +0100
    Reviewed-on: http://localhost:9080/7
    Project: SkillsMatter
    Branch: refs/heads/master

좋은 예제. 자동화 과정에서 필요한 정보를 git notes로 남기면 괜찮겠다. 웹페이지를 안 열고 git 명령어로 바로 볼 수 있으니깐. 그리고 노트를 key: value 형식으로 저장하는데, 보기도 좋고 구문분석도 쉽다.

프로그래머가 git notes를 추가할 일이 있을까? 코드 리뷰 가이드 정도는 남기면 도움이 되지 않을까? 글쎄 내 생각엔 커밋 메시지만으로도 충분할 것 같다. 가이드할 정도면 핵심인 거니 사양하지 말고 적으면 된다.

그래서 git notes를 프로그래머는 읽기만. 기계는 쓰기만. 괜찮은 정책 같다.

자동화 과정에서 커밋에 추가하면 좋을 정보들을 찾아봐야겠다. 빌드 성공, 실패 정보. 배포 리비전 번호. CI 빌드 태스크 번호. 지금은 이 정도 생각난다. geocommit 처럼 재미있게 쓰는 사람도 있네. 내가 쓰면 지도에 한 점으로만 나오겠지.

PS: 왜 git notes는 머지가 어렵다고 했을까? git 객체로 똑같이 저장된다. 딱히 어려워 보이는 건 없는데…

참고

git notes 저장 방법을 추적한 로그

$ git log --oneline
8926ca5 third
07b134c second
3a96a59 first

커밋을 세 개 추가.

$ git notes add -m "first commit notes" 3a96a59

노트를 추가하고

$ git log 3a96a59
...
Notes:
    first commit notes

로그를 보면 기본으로 노트가 보인다.

$ git notes append -m "appended notes" 3a96a59
$ git notes add -m "third commit notes" 8926ca5

노트를 추가할 수도 있다.

$ git rev-parse refs/notes/commits
63b17cf

기본 네임스페이스는 commits

$ git cat-file -t 63b17cf
commit

커밋 객체다

$ git cat-file -p 63b17cf
tree 0fd34a2efa41749d2be10ecbaf8d7da6446aef7f
parent fdd10abd0254455e1d09a217359b4dd508f2c6bc

이런 게 있어야 커밋 객체지.

$ git cat-file -p 0fd34a2
$ git ls-tree 0fd34a2
100644 blob c8c3ecdd51eab6bb112688076162d3eb9aad9f60	3a96a59ca5b9433eaf091f75a7c53c211ef788ec
100644 blob c8d4ac1b4d69bef8000c15540f2379d473fbc42c	8926ca50e3f3997dd98b8dc9d4b4b29cc2079538

fileSHA1 이다. 이게 다르다.

$ git cat-file -p c8c3ecd
first commit notes

appended notes

$ git cat-file -p c8d4ac1
third commit notes

blob 에 노트가 들어있다.