5 간단한 Git 훅으로 리포지토리 관리하기

Git은 훌륭한 도구입니다. Git은 훅을 통해 파일의 변경 사항을 추적할 수 있을 뿐만 아니라 다른 사람들과 원활하게 협업할 수 있게 해줍니다. 이러한 점에서 Git은 FOSS의 발전을 촉진한 도구 중 하나입니다.
하지만 Git의 가장 큰 문제 중 하나는 리포지토리를 관리하는 데 시간과 노력이 필요하다는 것입니다. 예를 들어, 이러한 리포지토리를 커밋하고 동기화하는 데는 두세 개의 git 명령어가 필요할 수 있습니다. 이는 관리가 지루할 뿐만 아니라 사용자 오류가 발생하기 쉬운 상황을 만듭니다. 여기에서는 리포지토리를 더 잘 관리하기 위한 몇 가지 간단하지만 효과적인 Git 훅을 소개합니다.
참고: Emacs에서 Git을 관리할 수도 있습니다. 방법을 알아보세요!
목차
- Git 훅이란?
- 마스터에 푸시 방지
- 마스터 브랜치에 대한 푸시 거부
- 리베이스로부터 리포지토리 잠금
- 코드에 대한 스타일 및 구문 검사 강제
- 리포지토리 변경 사항으로 사용자 자동 알림
- 자주 묻는 질문
Git 훅이란?
기본적으로 git-hook은 Git이 리포지토리에서 작업을 수행할 때마다 실행되는 사용자 정의 스크립트를 생성하는 데 사용할 수 있는 유연한 하위 명령입니다. 예를 들어, 커밋하기 전에 리포지토리에서 스타일 오류를 자동으로 확인하는 훅을 사용할 수 있습니다.

훅 하위 명령은 리포지토리의 “.git” 디렉토리 아래에 있는 “hooks” 폴더를 읽음으로써 작동합니다. 이 폴더에는 Git의 모든 작업에 대해 자동화할 수 있는 샘플 스크립트를 제공하는 여러 개의 미리 만들어진 파일이 포함되어 있습니다.

대부분의 경우, 원하는 스크립팅 언어로 git 훅을 작성할 수 있습니다. 이는 모든 소프트웨어 개발자에게 매우 유연하고 접근 가능하게 만듭니다.
팁: Git을 시작하려면 먼저 Git의 사용자 이름과 이메일을 설정해야 합니다. 이 가이드에서 방법을 알아보세요.
1. 마스터에 푸시 방지
사용자가 Git에서 가장 흔히 저지르는 실수 중 하나는 개발 브랜치에서 마스터로 직접 커밋을 푸시하는 것입니다. 이는 Github를 사용하여 프로젝트를 추적하고 유지 관리하는 경우 매우 실망스러울 수 있습니다.

이 문제를 방지하려면 마스터 브랜치에서 리포지토리를 푸시하려고 할 때마다 확인하고 확인하는 “pre-push” Git 훅을 생성하면 됩니다.
- 보호하려는 Git 리포지토리로 이동합니다.

- 확인 스크립트가 포함된 Git 훅 파일을 생성합니다. 이는 “푸시” 전에 실행되어야 하는 훅이므로 “pre-push” 훅 파일을 생성해야 합니다:
touch .git/hooks/pre-push- 텍스트 편집기에서 새 훅 파일을 엽니다.
nano .git/hooks/pre-push- 내부에 새 “pre-push” 훅을 작성합니다. 예를 들어, 다음은 마스터 브랜치에서 푸시할 때 확인을 요청하는 스크립트입니다:
#!/bin/sh
protect='master'
current=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')
if[$protect = $current]
then
read-p"Confirm push to master? Y/n."-n1-r/dev/null
then
exit0
fi
exit1
else
exit0
fi- 새 훅을 저장합니다. nano에서는 Ctrl + O를 누른 다음 Ctrl + X를 눌러 저장합니다.

- 다음 명령을 실행하여 Git이 새 훅을 실행할 수 있는지 확인합니다.
chmod +x .git/hooks/pre-push2. 마스터 브랜치에 대한 푸시 거부
마스터에 푸시하는 것을 방지하는 것 외에도, 서버 측 훅을 생성하여 마스터 브랜치에 대한 모든 푸시를 거부할 수 있습니다. 이는 여러 개발자와 리포지토리를 공유하는 경우 매우 유용합니다.

이 문제를 해결하려면 제한된 사용자가 마스터 브랜치에 푸시하는 것을 자동으로 방지하는 “pre-receive” 훅을 생성합니다.
- 원격 리포지토리에 “pre-receive” Git 훅 파일을 생성합니다.
touch .git/hooks/pre-receive- 이 파일을 엽니다.
nano .git/hooks/pre-receive- “pre-receive” 훅에 거부 스크립트를 추가합니다. 예를 들어, 다음 코드 줄은 즉시 작동해야 합니다:
#!/bin/sh
branch=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')
blacklist=(alice bob)
if[[${blacklist[*]} =~ $USER]]; then
if["$branch" == "master"]; then
echo"You are not allowed commit changes in this branch"
exit1
fi
fi새 훅 파일을 저장합니다. 제 경우에는 Ctrl + O를 누른 다음 Ctrl + X를 눌러 파일을 저장해야 합니다.
훅 스크립트를 저장하고 실행 가능하게 만듭니다.
chmod +x .git/hooks/pre-receive팁: Git 별칭을 사용하여 Git 사용을 더 효율적으로 만들 수 있습니다.
3. 리베이스로부터 리포지토리 잠금
사용자가 Git에서 저지르는 또 다른 일반적인 실수는 현재 활성 브랜치를 리베이스하는 것입니다. 이는 여러 기여자가 있는 리포지토리에서 작업하는 경우 매우 실망스러운 문제일 수 있으며, 리베이스는 다른 사용자가 만든 커밋을 제거합니다.

이 문제를 방지하려면 현재 브랜치가 잠겨 있는지 확인하는 “pre-rebase” 훅을 생성합니다.
- “.git/hooks” 디렉토리에 “pre-rebase” 파일을 생성합니다:
touch .git/hooks/pre-rebase- 이 파일을 편집을 위해 엽니다.
nano .git/hooks/pre-rebase- 새 훅 파일에 리베이스 스크립트를 추가합니다.
#!/bin/sh
branch="$2"
[-n"$branch"]||branch=$(git rev-parse--abbrev-ref HEAD)
lock="branch.${branch}.rebaselock"
if["$(git config --bool "$lock")" = true]; then
echo"pre-rebase hook: \"$lock\" is set to true. Refusing to rebase."
exit1
fi- 새 훅 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x .git/hooks/pre-rebase4. 코드에 대한 스타일 및 구문 검사 강제
Git 훅의 가장 유용한 사용 중 하나는 코드 린터와 연결하는 것입니다. 이는 코드가 프로젝트의 스타일과 형식을 따르는지 확인하는 간단한 프로그램입니다.

- Git 리포지토리에 린터를 연결하려면 먼저 “pre-commit” 훅 파일을 만듭니다.
touch .git/hooks/pre-commit- 프로젝트 언어에 적합한 린터를 설치합니다. 이 경우, Bash 코드를 분석하기 위해 “shellcheck”를 사용합니다:
sudo apt install shellcheck- 새 훅 파일을 열고 다음 스크립트를 추가합니다.
#!/bin/bash
forfilein $(git diff--cached--name-only--diff-filter=AM |grep-E'\.sh$')
do
shellcheck "$file"# Run the linter for every new file.
if[$?-ne0]; then
exit1# Terminate the commit if the linter fails.
fi
done- 새 훅 파일을 저장하고 실행 가능하게 만듭니다:
chmod +x .git/hooks/pre-commit5. 리포지토리 변경 사항으로 사용자 자동 알림
마지막으로, 리포지토리에 새 커밋이 수신될 때마다 자동으로 이메일을 보내는 Git 훅을 생성할 수도 있습니다. 이는 리포지토리에 대한 간단한 알림 시스템을 만들고 싶을 때 유용합니다.
- 리포지토리의 .git/hooks 디렉토리에 “post-receive” 훅 파일을 생성합니다:
touch .git/hooks/post-receive- 새 Git 훅 파일을 열고 다음 스크립트를 입력합니다:
#!/bin/sh
commit_message=$(git log-1--pretty=%B)
users=("[email protected]""[email protected]""[email protected]")
for user in"${users[@]}"; do
mail -s"New Commit: $commit_message"$user- 새 훅 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x .git/hooks/post-receive자주 묻는 질문
Git 훅을 C와 같은 컴파일된 언어로 작성할 수 있나요?
Git 훅의 가장 큰 제한 중 하나는 터미널에서 직접 실행할 수 있는 언어를 사용해야 한다는 것입니다. 이는 Git 훅이 스크립트에 대해 컴파일된 언어를 지원하지 않음을 의미합니다. 예를 들어, Python이나 Shell을 사용하여 새로운 Git 훅을 생성할 수 있지만 C나 C++는 사용할 수 없습니다.
동일한 Git 리포지토리에서 여러 훅을 실행할 수 있나요?
예. 위의 예제는 훅을 단일, 개별 기능으로 보여주지만, 이를 쉽게 혼합하여 고유한 워크플로를 생성할 수 있어 Git 훅은 모든 코딩 상황에 대해 매우 유연하고 적응 가능합니다. 예를 들어, “마스터에 푸시 방지” pre-push 훅과 “구문 검사” pre-commit 훅을 자신의 리포지토리에서 사용할 수 있습니다.
이메일 Git 훅이 사용자에게 이메일을 보내지 않나요?
이 문제는 원격 서버가 제대로 발신 이메일을 보낼 수 없기 때문일 가능성이 높습니다. 이를 해결하려면 원격 서버가 안전하고 작동하는 메일 배달 에이전트 및 SMTP 도메인이 있는지 확인하십시오.
이미지 출처: Unsplash. 모든 수정 및 스크린샷 Ramces Red.