ABOUT ME

Today
Yesterday
Total
  • [git] 커밋 메시지에 preifx 붙이기는 git hook
    Dev 2025. 4. 7. 01:22
    반응형

    커밋 메시지에 자동으로 prefix를 붙이는 git hook을 만들어보겠습니다.

    # 0. git hook 만들기

     

    처음 git hook을 만든다면 기본적으로 아래 3가지 단계를 거쳐야 합니다.

    1. .git/hooks/ 경로에 파일 생성
    2. 실행 권한 부여
    3. 원하는 프리픽스를 넣는 스크립트 작성

     

    실행 권한 부여는 아래 커멘드를 입력합니다.
    만약 스크립트 파일 이름을 prepare-commit-msg 라고 지었다고 가정하면 아래 커멘드를 입력하면 됩니다.

    chmod +x .git/hooks/prepare-commit-msg

     

    # 1. 기본 > git hook으로 프리픽스 붙이기

    "[LOGIN]" 프리픽스를 자동으로 붙이는 git hook을 만들어 보겠습니다.

    #!/bin/sh
    
    PREFIX="[LOGIN]"
    
    # 커밋 메시지 파일 경로는 첫 번째 인자로 들어옴
    COMMIT_MSG_FILE=$1
    
    # 메시지에 이미 프리픽스가 있으면 패스
    if ! grep -q "$PREFIX" "$COMMIT_MSG_FILE"; then
      sed -i.bak "1s/^/$PREFIX /" "$COMMIT_MSG_FILE"
    fi

     

    # 2. 응용 > 브랜치 이름으로 프리픽스 붙이기

    브랜치 이름을 가져오고 싶다면, 아래처럼 가져올 수 있습니다.

    BRANCH_NAME=$(git symbolic-ref --short HEAD)
    PREFIX="[${BRANCH_NAME}]"

     

    그리고 일반적으로 브랜치를 만들 때 "/" 를 기준으로 폴더를 구분합니다. 따라서 위 커멘트를 그대로 사용하면 아래와 같은 에러가 발생합니다. 

    sed: 1: "1s/^/[~~~] /": bad flag in substitute command: 'n'

    현재 sed 명령어에서 "/" 가 구분자로 쓰이고 있는데, 브랜치 이름에서도 "/" 가 들어가니까 문제라는 말입니다.

    이 경우 sed 명령어에서 다른 구분자를 사용해주면 문제가 없겠죠? "|", "#" #@" 같은 것들도 쓸 수 있다고 합니다.
    따라서 "|" 로 바꿔서 브랜치 명을 가져온다면, 아래와 같이 만들 수 있습니다.

    #!/bin/sh
    
    COMMIT_MSG_FILE=$1
    BRANCH_NAME=$(git symbolic-ref --short HEAD)
    PREFIX="[${BRANCH_NAME}]"
    
    # 이미 프리픽스가 있으면 중복 방지
    if ! grep -q "$PREFIX" "$COMMIT_MSG_FILE"; then
      sed -i.bak "1s|^|$PREFIX |" "$COMMIT_MSG_FILE"
    fi

     

    # 3. 응용 > 브랜치 이름 중 마지막만 가져오기

    만약 대부분의 브랜치를 feature/ 와 같은 경우로 만든다면, feature/ 가 계속 반복되는 게 큰 의미가 없을 수 있습니다.
    feature/ 뒤에 붙은 것만 사용하는 방법을 알아보겠습니다.

    브랜치 이름을 / 를 기준으로 나누고 제일 마지막만 가져오는 스크립트 입니다.

    #!/bin/sh
    
    COMMIT_MSG_FILE=$1
    
    # 현재 브랜치 이름 얻기
    BRANCH_NAME=$(git symbolic-ref --short HEAD)
    
    # "/" 기준으로 나눠서 마지막 조각만 추출
    PREFIX_PART=${BRANCH_NAME##*/}  # 예: "feature/9nav" → "9nav"
    PREFIX="[${PREFIX_PART}]"
    
    # 커밋 메시지에 이미 프리픽스가 있다면 추가하지 않음
    if ! grep -q "$PREFIX" "$COMMIT_MSG_FILE"; then
      sed -i.bak "1s|^|$PREFIX |" "$COMMIT_MSG_FILE"
    fi

     

    참고로 마지막 문자열을 가져오는 문법은 별도로 정리해봤습니다. (https://woongs.tistory.com/77)

     

    감사합니다.

    반응형

    댓글

Designed by Tistory.