프로젝트별 git 커밋 템플릿
사람들은 커널 git 로그의 품질을 다른 프로젝트와 비교해 보고, 울면서 잠들어야 한다.
– 리누스 토르발스
당신 프로젝트의 커밋 가이드라인은 절대 기억하지 못합니다.
모든 프로젝트가 제각각 다른 걸 고집합니다:
하지만 git commit templates가 도움이 됩니다. 커밋 템플릿은 커밋 메시지를 위한 뼈대를 제공해, 필요한 문서를 필요한 곳, 즉 커밋 메시지를 작성하는 에디터 안에서 바로 보여줍니다.
git 커밋 템플릿이란?
git commit을 입력하면 git이 텍스트 에디터를 열어줍니다1. git은 에디터를 커밋 템플릿으로 미리 채워 줄 수 있습니다. 마치 작성해야 할 양식과 같습니다.
커밋 템플릿을 만드는 방법은 간단합니다.
- 플레인 텍스트 파일을 하나 만듭니다. 저는
~/.config/git/message.txt에 만들어 두었습니다. - git이 이 파일을 사용하도록 설정합니다:
git config --global \
commit.template '~/.config/git/message.txt'내 기본 템플릿에는 커밋 작성에 대해 제가 아는 모든 것이 담겨 있습니다.
IncludeIf로 만드는 프로젝트별 템플릿
커밋 템플릿의 진정한 마법은 프로젝트마다 다른 템플릿을 사용할 수 있다는 점입니다.
git의 includeIf 설정으로 프로젝트마다 다른 템플릿을 사용할 수 있습니다2.
Linux 커널, git, MediaWiki 같은 대형 프로젝트들은 각자 고유의 커밋 가이드라인을 가지고 있습니다.
Wikimedia 작업을 위해 저는 git 저장소를 ~/Projects/Wikimedia에 모아두고, 전역 git 설정 파일(~/.config/git/config) 맨 아래에 다음과 같이 추가해 두었습니다:
[includeIf "gitdir:~/Projects/Wikimedia/**"]
path = ~/.config/git/config.wikimediaconfig.wikimedia에서는 Wikimedia 전용 커밋 템플릿을 지정합니다. 그 외에도 user.email이나 core.hooksPath 같은 다른 git 설정도 재정의합니다.
예시: 나의 전역 템플릿
내 기본 커밋 템플릿은 세 섹션으로 이루어져 있습니다:
- Subject – 50자 이내, 대문자로 시작, 마침표 없음.
- Body – 72자에서 줄 바꿈하며 제목과는 빈 줄로 구분합니다.
- Trailers – 표준 형식을 사용하며 본문과는 빈 줄로 구분합니다.
각 섹션에는 형식3과 내용에 대한 가이드를 넣어 두었습니다.
헤더 부분의 가이드는 간단합니다:
# 50ch. wide ----------------------------- SUBJECT
# |
# "If applied, this commit will..." |
# |
# Change / Add / Fix |
# Remove / Update / Document |
# |
# ------- ↓ LEAVE BLANK LINE ↓ ---------- /SUBJECT본문에서는 스스로에게 기본적인 질문에 답하도록 상기시킵니다:
# 72ch. wide ------------------------------------------------------ BODY
# |
# - Why should this change be made? |
# - What problem are you solving? |
# - Why this solution? |
# - What's wrong with the current code? |
# - Are there other ways to do it? |
# - How can the reviewer confirm it works? |
# |여기까지가 전부입니다. git 트레일러만 남았습니다.
미로 같은 git 트레일러
내 템플릿에는 제가 참여하는 프로젝트에서 사용하는 트레일러를 위한 섹션이 있습니다.
# TRAILERS |
# -------- |
# (optional) Uncomment as needed. |
# Leave a blank line before the trailers. |
# |
# Bug: #xxxx
# Acked-by: Example User <[email protected]>
# Cc: Example User <[email protected]>
# Co-Authored-by: Example User <[email protected]>
# Requested-by: Example User <[email protected]>
# Reported-by: Example User <[email protected]>
# Reviewed-by: Example User <[email protected]>
# Suggested-by: Example User <[email protected]>
# Tested-by: Example User <[email protected]>
# Thanks: Example User <[email protected]>이 트레일러들은 유용한 문서 조각으로 남습니다. Git은 표준 명령어로 트레일러를 파싱할 수 있습니다.
예를 들어 커밋과 관련 태스크를 탭으로 구분한 목록을 만들고 싶다면, git log로 Bug 트레일러를 찾아낼 수 있습니다:
$ TAB=%x09
$ BUG_TRAILER='%(trailers:key=Bug,valueonly=true,separator=%x2C )'
$ SHORT_HASH=%h
$ SUBJ=%s
$ FORMAT="${SHORT_HASH}${TAB}${BUG_TRAILER}${TAB}${SUBJ}"
$ git log --topo-order --no-merges \
--format="$FORMAT"
d2b09deb12f T359762 Rewrite Kurdish (ku) Latin to Arabic converter
28123a6a262 T332865 tests: Remove non-static fallback in HookRunnerTestBase
4e919a307a4 T328919 tests: Remove unused argument from data provider in PageUpdaterTest
bedd0f685f9 objectcache: Improve `RESTBagOStuff::handleError()`
2182a0c4490 T393219 tests: Remove two data provider in RestStructureTest커밋 메시지 가이드라인 외우기는 그만두세요
Git 커밋 템플릿은 무엇을 써야 할지 기억해야 하는 부담에서 뇌를 해방시켜, 당신이 전달해야 할 이야기에 집중할 수 있게 해줍니다.
뇌는 잘하는 일에 아껴 쓰세요.
글을 무작위로 읽기