Per-project git commit templates

Tyler Cipriani

프로젝트별 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.wikimedia

config.wikimedia에서는 Wikimedia 전용 커밋 템플릿을 지정합니다. 그 외에도 user.email이나 core.hooksPath 같은 다른 git 설정도 재정의합니다.

예시: 나의 전역 템플릿

내 기본 커밋 템플릿은 세 섹션으로 이루어져 있습니다:

  1. Subject – 50자 이내, 대문자로 시작, 마침표 없음.
  2. Body – 72자에서 줄 바꿈하며 제목과는 빈 줄로 구분합니다.
  3. 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 logBug 트레일러를 찾아낼 수 있습니다:

$ 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 커밋 템플릿은 무엇을 써야 할지 기억해야 하는 부담에서 뇌를 해방시켜, 당신이 전달해야 할 이야기에 집중할 수 있게 해줍니다.

뇌는 잘하는 일에 아껴 쓰세요.


  1. git 설정의 core.editor부터 시작해 셸의 $VISUAL이나 $EDITOR를 거쳐, 최종적으로는 vi로 대체됩니다.↩︎

  2. 저장소의 .git/config 안에 직접 설정할 수도 있지만, 하나의 디렉터리 아래에 동일한 규칙을 따르는 저장소가 여러 개 있을 때는 includeIf가 유용합니다.↩︎

  3. 모두 Tim Pope에게서 가져왔습니다.↩︎

원문은 Tyler Cipriani님이 에 게재했습니다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.