- Git notes는 Git 객체를 바꾸지 않고 별도 네임스페이스에 메타데이터를 붙이는 기능이지만, 낮은 사용성과 제한적 채택 때문에 널리 쓰이지 않음
- 오래된 커밋 메시지를 고치지 않아도 새 정보를 덧붙일 수 있어, 리뷰·빌드·티켓 정보처럼 자동화 시스템이 남기는 기록에 잘 맞음
- Git 프로젝트와 Gerrit은 notes를 실제로 활용해 커밋별 메일링 리스트 토론, 테스트 결과, 리뷰어 정보를
git log에서 확인할 수 있게 함 - Google의 git-appraise는 git notes 위에 분산 코드 리뷰를 구현해 리뷰 요청, 댓글, 리뷰, 병합을 로컬에서 수행할 수 있게 함
- GitHub는 2014년에 커밋 notes 표시를 중단했고, blob·tree notes는 Git 내부 명령에 익숙해야 해 프로젝트 히스토리 분산이라는 가능성에도 쓰기 어려움
Git 객체를 바꾸지 않는 메타데이터
- Git notes는 Git이 추적하는 객체에 별도 메타데이터를 저장하는 기능임
- 대상은 커밋뿐 아니라 blob과 tree도 포함됨
- 객체 자체를 수정하지 않고 별도 네임스페이스에 정보를 붙임
- 이미 히스토리에 들어간 커밋 메시지는 보통 안전하게 고치기 어렵지만, notes를 쓰면 오래된 커밋에도 새 정보를 추가할 수 있음
- 다음처럼
git notes add -m으로 메모를 붙일 수 있음git notes add -m 'Acked-by: <tyler@tylercipriani.com>' - 이후
git log에서 해당 커밋 아래에Notes:블록으로 표시됨
- 다음처럼
- Scott Chacon은 2010년 GitHub.blog에서 notes를 다른 개발자와의 대화보다 티켓·빌드 시스템 같은 자동화 기록을 붙이는 데 더 적합한 기능으로 봄
실제 활용과 막히는 지점
- Git 프로젝트는 각 커밋을 메일링 리스트 토론과 연결하는 데 notes를 사용함
- 예시 커밋의
Notes (amlog)에는Message-Id가 들어 있고, 이 값이 패치 토론 스레드로 이어짐
- 예시 커밋의
- notes는 커밋이나 브랜치별 작업 시간 추적,
git log에 리뷰·테스트 정보 추가, 완전 분산 코드 리뷰 같은 용도로도 쓰임 - Gerrit의 reviewnotes 플러그인은 코드 리뷰 메타데이터를 Git 안에서 오프라인으로 볼 수 있게 함
- notes를 가져오고 표시하는 명령은 다음과 같음
git fetch origin refs/notes/review:refs/notes/review git log --show-notes=review - 표시 정보에는
Verified+1,Verified+2,Code-Review+2,Submitted-by,Submitted-at,Reviewed-on,Project,Branch등이 포함됨
- notes를 가져오고 표시하는 명령은 다음과 같음
- Google의 git-appraise는 git notes 위에 구축된 “fully distributed code review” 시스템임
- GitHub, GitLab 같은 코드 forge와 독립적으로 동작함
- 변경 리뷰 요청, 변경에 대한 댓글, 리뷰와 병합을 로컬 컴퓨터에서 수행할 수 있음
- 웹 인터페이스도 포함함
- 가장 큰 약점은 사용성임
- GitHub는 2014년에 커밋 notes 표시를 중단함
- 커밋 notes는
gitconfig설정으로 자동 fetch와git log표시를 어느 정도 쉽게 만들 수 있음git config --add \ remote.origin.fetch \ '+refs/notes/*:refs/notes/*' git config \ notes.displayRef \ 'refs/notes/*' - blob이나 tree에 notes를 저장하려면 Git의 plumbing에 익숙해야 함
- Git은 코드 히스토리를 분산하지만, Git 저장소의 많은 가치는 GitHub 같은 forge 안에 잠겨 있음
- git notes는 코드뿐 아니라 프로젝트 전체 히스토리를 분산하는 경로가 될 수 있음