Git Hooks: 커밋 메시지 및 브랜치 이름 적용

팀 간의 표준화를 원하면 엄격한 규칙을 적용해야 할 수도 있습니다. git에 대한 규칙의 몇 가지 예는 다음과 같습니다.
  • 분기는 ISSUE-0000/feature-name으로 생성해야 합니다.
  • 모든 커밋 메시지는 ISSUE-0000(Jira 문제 ID)으로 시작해야 합니다.

  • 이 게시물에서는 git hooks를 사용하여 언급한 두 가지 규칙을 추가하는 방법을 보여 드리겠습니다.


    여러 단계에서 작동하는 여러git hooks이 있습니다. 우리는 규칙을 위해 두 개의 클라이언트 측 후크를 사용할 것입니다.

  • 사전 커밋: 이 후크는 git-commit에 의해 호출되며 --no-verify 옵션으로 우회할 수 있습니다. 커밋하기 전에 브랜치 이름을 확인하기 위해 이 후크를 사용할 것입니다.

  • commit-msg: 이 후크는 git-commit 및 git-merge에 의해 호출되며 --no-verify 옵션을 사용하여 우회할 수 있습니다. 제안된 커밋 메시지를 포함하는 파일의 이름인 단일 매개변수를 사용합니다. 커밋 메시지를 확인하기 위해 이 후크를 사용할 것입니다. 그리고 필요한 경우 커밋 메시지를 수정합니다.

  • 후크 폴더 생성



    홈 디렉토리로 이동하여 hooks 라는 폴더를 만듭니다. 그리고 후크 파일을 생성합니다.

    mkdir ~/hooks
    cd ~/hooks
    
    touch pre-commit
    chmod +x pre-commit
    
    touch commit-msg
    chmod +x commit-msg
    



    지점 이름 제한



    브랜치 이름을 ISSUE-0000/feature-name으로 수락하지만 main , develop , release 등과 같은 다른 브랜치 이름도 고려해야 합니다. 이를 위해 다음 정규식을 사용할 수 있습니다.

    REGEX_ISSUE_ID="^(ISSUE-[0-9]+\/([a-zA-Z0-9]|-)+|develop|main|release"
    


    브랜치 이름도 필요합니다.

    git rev-parse --abbrev-ref HEAD
    


    그게 다야! 우리는 정규식이 있고 브랜치 이름이 있습니다. ISSUE-0000/feature-name 또는 develop 또는 main 또는 release 로 시작하는 지점 이름을 확인합니다. 확인이 실패하면 오류 메시지가 표시되고 exit code 1 와 함께 종료됩니다.
    pre-commit
    #!/bin/bash
    
    REGEX_ISSUE_ID="^(ISSUE-[0-9]+\/([a-zA-Z0-9]|-)+|develop|main|release"
    
    ISSUE_ID_IN_BRANCH=$(echo $(git rev-parse --abbrev-ref HEAD) | grep -o -E "$REGEX_ISSUE_ID")
    
    if [[ -z "$ISSUE_ID_IN_BRANCH" ]]; then
        echo "[pre-commit-hook] Your branch name is illegal. Please rename your branch with using following regex: $REGEX_ISSUE_ID"
        exit 1
    fi
    



    커밋 메시지 제한



    단계는 분기 이름을 제한하는 것과 유사합니다. 그러나 커밋 메시지에 문제 ID가 없으면 브랜치 이름을 보고 거기에서 가져오려고 합니다. 문제 ID가 브랜치 이름에도 없으면 오류가 발생합니다.

    REGEX_ISSUE_ID="^(ISSUE-[0-9]+|Merge|hotfix)"
    


    첫 번째 인수$1는 commit-msg 파일을 제공합니다. 다음 명령으로 커밋 메시지를 읽을 수 있습니다.

    cat "$1"
    


    우리는 regex를 가지고 있고 메시지 이름을 커밋해야 하고 마지막 단계에서 브랜치 이름을 얻는 방법을 알고 있습니다. 커밋 메시지가 ISSUE-0000 또는 Merge 또는 hotfix 로 시작하는지 확인합니다.

    커밋 확인이 실패하면 브랜치 이름을 확인하고 문제 ID를 구문 분석하고 커밋 메시지에 삽입합니다.

    검사가 다시 실패하면 오류 메시지가 표시되고 exit code 1 와 함께 종료됩니다.
    commit-msg
    #!/bin/bash
    
    REGEX_ISSUE_ID="^(ISSUE-[0-9]+|Merge|hotfix)"
    ISSUE_ID_IN_COMMIT=$(echo $(cat "$1") | grep -o -E "$REGEX_ISSUE_ID")
    
    if [[ -z "$ISSUE_ID_IN_COMMIT" ]]; then
        BRANCH_NAME=$(git symbolic-ref --short HEAD)
        ISSUE_ID=$(echo "$BRANCH_NAME" | grep -o -E "$REGEX_ISSUE_ID")
    
        if [[ -z "$ISSUE_ID" ]]; then
            echo "[commit-msg-hook] Your commit message is illegal. Please rename your branch with using following regex: $REGEX_ISSUE_ID"
            exit 1
        fi
    
        echo "$ISSUE_ID | $(cat "$1")" > "$1"
    fi
    



    용법



    프로젝트 폴더로 이동하여 다음 명령을 실행하여 후크를 사용합니다. 후크를 사용하려는 모든 프로젝트에 대해 이것을 만들어야 합니다.

    cd <your-team-repository>
    git config core.hooksPath ~/hooks
    



    팀원과 공유


    ~/hooks 폴더를 공유해야 합니다. git 저장소와 공유하거나 폴더를 팀에 직접 보낼 수 있습니다.

    좋은 웹페이지 즐겨찾기