GIT 후크를 사용하여 기존 커밋 메시지를 적용하는 방법

6198 단어 ubuntugithublinux
Originally published on prahladyeri.com

Conventional git commit messages 가지고 있는 것도 좋지만 있으면 좋은 것입니다. 사실, 일단 당신이 그것들을 알게 되면, 당신은 그것들이 어떤 진지한 프로그래밍 프로젝트에서 필수적이라는 것을 느끼기 시작할 것입니다. 예를 들어 다음 두 커밋 메시지의 차이점을 고려하십시오.

git commit -m "added social login feature for authentication using twitter"
git commit -m "feat(authentication): added social login using twitter"

두 번째 것은 가독성이 더 높을 뿐만 아니라 Travis CI 및 Appveyor와 같은 빌드 도구와 더 쉽게 통합할 수 있도록 하는 표준을 따릅니다. 뿐만 아니라 CHANGELOG가 다음과 같을 때 git log 생성을 쉽게 자동화할 수 있습니다.

> git log --oneline
61c8ca9 (HEAD -> master) fix: navbar not responsive on mobile
479c48b test: prepared test cases for user authentication
a992020 chore: moved to semantic versioning
b818120 fix: button click even handler firing twice
c6e9a97 fix: login page css
dfdc715 feat(authentication): added social login using twitter

대체로 저는 기존 커밋 메시지를 너무 좋아해서 선택 사항으로 유지하고 싶지 않고 기본 생활 방식으로 만들고 싶습니다. 어떻게 해야 하나요? 답은 간단합니다. git hooks입니다.

후크 작업을 위해 git ninja나 전문가가 될 필요는 없습니다. 특별한 git 리포지토리 폴더( .git 로 명명) 안에 몇 가지 다른 특별한 폴더가 있다는 것을 아는 것으로 충분합니다.

logs
hooks
objects
refs

우리가 관심을 갖는 것은 hooks 입니다. 이를 중단하려면 컴퓨터에서 테스트 프로젝트를 만들고 다음을 실행하여 빈 git 저장소를 초기화하십시오.

git init .

이제 방금 생성된 .git 폴더를 방문하여 hooks 폴더로 이동합니다. 확장자가 .sample인 스크립트가 많이 있을 것입니다(모두 비활성화됨을 의미함). 우리가 관심을 갖는 것은 commit-msg 입니다. 이것은 커밋이 생성되기 직전에 실행되는 후크이므로 메시지가 적절한 형식이 아닌 경우 오류를 발생시켜 커밋을 거부할 수 있습니다.
commit-msg라는 이름의 이 디렉토리에 새 스크립트를 만들고 좋아하는 편집기를 사용하여 아래 코드(python이 설치되어 있어야 함)를 추가합니다(내 것은 메모장++입니다!):

#!/usr/bin/env python
import re, sys, os

def main():
    # example:
    # feat(apikey): added the ability to add api key to configuration
    pattern = r'(build|ci|docs|feat|fix|perf|refactor|style|test|chore|revert)(\([\w\-]+\))?:\s.*'
    filename = sys.argv[1]
    ss = open(filename, 'r').read()
    m = re.match(pattern, ss)
    if m == None: raise Exception("conventional commit validation failed")

if __name__ == "__main__":
    main()


스크립트를 저장하고 실행 가능하게 만드십시오(Linux에서는 chmod u+x commit-msg를 실행하고 Windows에서는 필요하지 않음). 이제 git repo를 초기화한 소스 코드 폴더로 돌아가 테스트용 소스 파일을 만듭니다. 그런 다음git add 비전통적인 메시지를 사용하여 테스트용으로만 커밋을 시도합니다. 모든 것이 잘되면 이렇게 실패해야합니다!

> git commit -m "added a new feature for xyz"
Traceback (most recent call last):
  File ".git/hooks/commit-msg", line 22, in <module>
    main()
  File ".git/hooks/commit-msg", line 19, in main
    if m == None: raise Exception("conventional commit validation failed")
Exception: conventional commit validation failed

이제 유효한 커밋 메시지로 테스트하면 작동합니다!

이것을 몇 번 연습하고 그것에 익숙해지면 나중에 사용하기 시작하는 모든 프로젝트git init에 대해 이 동작을 기본값으로 설정하고 싶을 것입니다. 그렇죠? 물론, 전역 git commit hook 템플릿을 생성하여 그렇게 할 수 있지만 그것은 다른 날의 포스트가 될 것입니다. 먼저 첫 번째 것들!

편집하다

이 일을 시행하고 자동화하는 데 정말로 관심이 있는 사람들을 위해 enforce-git-message 이라는 python 패키지를 게시했습니다. 해당 python 패키지를 설치하기만 하면 위의 스크립트가 자동으로 ~/.git-templates 디렉토리에 복사되고 git config init.templatedir 값도 설정됩니다.

pip install enforce-git-message

참조:
  • https://www.conventionalcommits.org/en/v1.0.0-beta.4/
  • https://stackoverflow.com/questions/3523534/good-ways-to-manage-a-changelog-using-git
  • https://stackoverflow.com/questions/37699261/how-to-validate-and-display-error-for-git-commit-message
  • https://coderwall.com/p/jp7d5q/create-a-global-git-commit-hook
  • 좋은 웹페이지 즐겨찾기