Git 후크 구현

완료됨

개발 프로세스에서 코드 품질의 우선 순위는 로컬 코드 개발부터 시작되어야 합니다. 잠재적인 코드 품질 문제를 검색하고 수정하기 위해 끌어오기 요청을 시작하기 전에도 이 방법에 대한 기회를 식별해야 합니다.

Git 후크는 좋은 기회를 제공합니다. 커밋, 병합, 푸시 등 Git 수명 주기 내의 중요한 이벤트에 대한 응답으로 사용자 지정 스크립트를 실행하는 메커니즘 역할을 합니다. 리포지토리의 .git\hooks 디렉터리에 있는 스크립트는 소프트웨어 개발 작업을 자동화하고 개발 표준을 적용하는 데 실질적으로 무제한의 유연성을 제공합니다.

Git 후크를 구현하는 방법

먼저 클라이언트 쪽 Git 후크를 살펴보겠습니다. 리포지토리 .git\hooks 디렉터리로 이동합니다. 확장자 sample이 있는 파일이 많이 있습니다. 이 확장은 해당 목적을 나타낼 뿐만 아니라 효과적으로 실행을 방지합니다. 파일 이름은 sample 확장자를 제거한 후 실행을 트리거하는 Git 작업을 지정합니다.

자동화를 위한 Git 후크 파일의 스크린샷

사전 커밋 sample 파일의 이름을 사전 커밋으로 바꿉니다. 파일 이름에서 알 수 있듯이 git 커밋 작업을 호출할 때마다 파일에 포함된 스크립트가 실행됩니다. 커밋은 사전 커밋 스크립트가 반환 값 0으로 종료되는 경우에만 수행됩니다.

그러나 기본적으로 이는 Windows 운영 체제에서 의도한 대로 작동하지 않는다는 점에 유의해야 합니다. 이 동작에 대해 일반적으로 간과되는 이유는 스크립트의 첫 번째 줄입니다.

#!/bin/sh

Linux 운영 체제에서는 #! 접두사는 파일의 나머지 부분에 해석될 스크립트가 포함되어 있고 /bin/sh가 사용해야 하는 해석기에 대한 전체 경로임을 프로그램 로더에 나타냅니다.

Windows용 Git은 Bash 명령과 셸 스크립트를 지원하지만 파일 시스템 경로를 지정할 때 동일한 규칙을 따르지 않습니다. 대신 드라이브 문자로 시작하는 sh.exe 파일의 전체 경로를 제공해야 합니다.

그러나 Windows용 Git은 기본적으로 C:\Program Files 디렉터리에 설치된다는 것도 주의해야 합니다. 이 디렉터리의 이름에는 공백이 포함되어 있으므로 sh.exe 파일에 대한 결과 경로는 두 개의 별도 경로로 해석되어 오류가 발생합니다. 이를 방지하려면 공백 앞에 백슬래시(\)를 하나 추가하여 이스케이프 문자 역할을 해야 합니다. 효과적으로 Windows용 Git의 64비트 버전을 사용하는 경우 스크립트의 첫 번째 줄은 다음 형식을 따라야 합니다.

#!C:/Program\ Files/Git/usr/bin/sh.exe

작업 방법

Git 사전 커밋 스크립트의 새로 발견된 기능을 어떻게 사용할 수 있나요? 실수로 GitHub에 비밀이 유출되는 것을 막는 방법은 무엇인가요?

Git 후크를 사용하여 로컬 리포지토리에 커밋되는 코드에서 특정 키워드를 검사하겠습니다. 사전 커밋 셸 파일의 콘텐츠를 다음 코드로 바꿉니다.

#!C:/Program\ Files/Git/usr/bin/sh.exe
matches=$(git diff-index --patch HEAD | grep '^+' | grep -Pi 'password|secret')
if [ ! -z "$matches" ]
then
  cat <<\EOT
Error: Words from the blocked list were present in the diff:
EOT
echo $matches
exit 1
fi

이 예는 완전한 솔루션이 아니라 개념을 설명하기 위한 것이므로 키워드 목록은 의도적으로 간단합니다. 정규식을 사용하면 범위와 유연성을 크게 확장할 수 있습니다. 또한 외부 파일을 참조하는 옵션도 있으므로 지속적인 유지 관리가 상당히 간소화됩니다.

사용 방법

일단 호출되면 사전 커밋 후크 스크립트는 git diff 및 grep 명령을 사용하여 커밋되는 코드의 증분 변경 내에서 키워드나 패턴을 식별합니다. 일치하는 항목이 검색되면 스크립트는 오류 메시지를 생성하고 커밋이 발생하지 않도록 합니다.

추가 사항:

커밋 전 후크 스크립트의 다른 일반적인 사용 사례에는 커밋이 프로젝트 표준을 준수하는지 확인하기 위한 코드 서식 지정, 린팅 또는 사용자 지정 테스트 실행이 포함됩니다. prepare-commit-msg는 커밋 메시지 편집기가 시작되기 전에 시작됩니다. 지정된 접두사 사용과 같은 명명 규칙을 적용하기 위해 커밋 메시지를 동적으로 생성할 수 있습니다(예: feat: 기능(features) 또는 fix: 버그 수정(bug fixes)).

예를 들어, 다음 prepare-commit-msg 스크립트는 새 커밋을 만들 때 현재 분기 이름을 커밋 메시지 앞에 자동으로 추가합니다. 파일 시작 부분에 분기 이름과 콜론 및 공백을 추가하여 커밋 메시지 파일($1)을 수정합니다.

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Get the current branch name
branch_name=$(git branch --show-current)
# Check if the commit message file exists
if [[ -f "$1" ]]; then
  # Prepend the branch name to the commit message
  sed -i "1s/^/$branch_name: /" "$1"
fi

커밋 후 스크립트는 커밋이 완료된 후 실행됩니다. 알림을 트리거하거나 설명서를 생성하는 데 사용할 수 있습니다.

예를 들어, 다음 스크립트는 커밋할 때마다 지정된 수신자에게 이메일 알림을 보냅니다. 수신자 이메일 주소, SMTP 서버, 이메일 제목 및 본문을 수정하여 스크립트를 사용자 지정할 수 있습니다. 또한 환경 및 요구 사항에 따라 Send-MailMessage PowerShell cmdlet을 사용하여 이메일을 보내거나 다른 방법을 사용하여 알림을 보내도록 시스템을 구성해야 할 수도 있습니다.

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Set the recipient email address
$recipient="your@email.com"
# Set the subject of the email
$subject="Git Commit Notification"
# Set the body of the email
$body="A new commit has been made to the repository."
# Send the email notification
Send-MailMessage -To $recipient -Subject $subject -Body $body -SmtpServer "your.smtp.server"

리포지토리 .git\hooks 폴더가 소스 제어에 커밋되지 않는다는 점은 주목할 가치가 있습니다. 개발한 스크립트를 개발팀의 다른 멤버와 공유할 수 있는 방법이 있는지 궁금할 것입니다. 이제 반갑게도 Git 버전 2.9부터 Git 후크를 소스 제어에 커밋할 수 있는 폴더에 매핑할 수 있습니다. Git 리포지토리에 대한 전역 설정 구성을 업데이트하여 이 작업을 수행할 수 있습니다.

Git config --global core.hooksPath '~/.githooks'

클라이언트 쪽에서 설정한 Git 후크를 덮어써야 하는 경우 no-verify 스위치를 사용하여 수행할 수 있습니다.

Git commit --no-verify

서버 쪽 후크

클라이언트 쪽 Git 후크는 개발 워크플로를 향상시키는 강력한 기능을 제공하는 반면, Azure Repos는 끌어오기 요청 만들기 지원을 포함하여 개발 프로세스를 더욱 강화하기 위한 서버 쪽 후크도 제공합니다. 자세한 내용은 Azure Repos 서비스 후크 이벤트 참조를 확인합니다.