
Git Hooks: Tự Động Hóa Kiểm Tra Code Trước Khi Commit Và Push
Git Hooks là cơ chế cho phép tự động chạy script tại các sự kiện quan trọng trong quy trình Git như pre-commit, pre-push, hay post-merge. Đây là công cụ thiết yếu để đảm bảo chất lượng code trước khi đưa vào repository, giúp đội ngũ phát triển tránh những lỗi phổ biến và duy trì tiêu chuẩn code nhất quán.

Git Hook Là Gì?
Git Hook là một script được Git kích hoạt tự động khi có sự kiện cụ thể trong vòng đời repository. Mỗi hook nằm trong thư mục .git/hooks/ và có thể là file shell script hoặc Python. Git phân biệt hai loại hook chính theo vị trí thực thi:
- Client-side hooks: Chạy trên máy developer — pre-commit, prepare-commit-msg, commit-msg, post-commit, pre-push. Các hook này kiểm soát hành vi cục bộ trước khi dữ liệu được gửi đến server.
- Server-side hooks: Chạy trên server — pre-receive, update, post-receive. Các hook này kiểm soát quyền truy cập và xác nhận tính hợp lệ của các commit trên server.

Các Git Hook Phổ Biến
Dưới đây là các hook được sử dụng nhiều nhất trong phát triển phần mềm:
| Hook | Thời điểm | Mục đích |
|---|---|---|
pre-commit |
Trước khi commit | Kiểm tra linting, định dạng code, quét secret |
prepare-commit-msg |
Trước khi mở editor commit | Chèn thông tin tự động vào commit message |
commit-msg |
Sau khi nhập message | Kiểm tra định dạng commit message đúng quy ước |
pre-push |
Trước khi push | Chạy test, kiểm tra branch protection |
post-commit |
Sau khi commit thành công | Thông báo, cập nhật notification |
post-merge |
Sau khi merge | Cập nhật dependency, khởi tạo cache |
Thiết Lập Pre-commit Hook
Pre-commit hook là hook quan trọng nhất, ngăn chặn code lỗi trước khi commit. Tạo file .git/hooks/pre-commit:
#!/bin/bash
# Chạy ESLint cho JavaScript
if command -v npx > /dev/null 2>&1; then
npx eslint . --ext .js,.ts --max-warnings=0
if [ $? -ne 0 ]; then
echo "Linting failed! Fix errors before committing."
exit 1
fi
fi
# Chạy Python black cho code formatting
if command -v black > /dev/null 2>&1; then
black --check .
if [ $? -ne 0 ]; then
echo "Code not formatted! Run black ."
exit 1
fi
fi
# Chạy pytest cho unit test
if command -v pytest > /dev/null 2>&1; then
pytest --tb=short
if [ $? -ne 0 ]; then
echo "Tests failed! Fix failing tests before committing."
exit 1
fi
fi
Sau đó cấp quyền thực thi:
chmod +x .git/hooks/pre-commit
Sử Dụng Husky Cho Quản Lý Hook Dễ Dàng
Thêm Git Hook thủ công là tẻ nhạt và dễ bị bỏ qua khi onboarding developer mới. Husky là công cụ phổ biến giúp quản lý Git hooks qua package.json:
npm install husky --save-dev
npx husky init
npx husky add .husky/pre-commit "npm run lint"
npx husky add .husky/pre-push "npm test"
Husky tự động tạo file hook trong .husky/ và sync với Git thông qua Git hooks path. Mỗi lần commit hoặc push, script tương ứng sẽ được chạy tự động. Điều này đảm bảo mọi developer trong team đều tuân thủ cùng một quy trình kiểm tra.
Ví Dụ Hook Kiểm Tra Secret
Một trường hợp sử dụng quan trọng: ngăn không để lộ API key, mật khẩu, token trong code. Dùng git-secrets hoặc Talisman:
# Cài đặt git-secrets
git secrets --install
git secrets --register-aws
git secrets --scan
# Thêm pattern tùy chỉnh
git secrets --add "AKIA[0-9A-Z]{16}"
git secrets --add --allowed "AKIAIOSFODNN7EXAMPLE"
Hook này sẽ chặn commit nếu phát hiện AWS keys, GitHub tokens, hoặc bất kỳ pattern bí mật nào được cấu hình. Talisman cung cấp khả năng phát hiện rộng hơn bao gồm password, private key, và file nhị phân. Đây là biện pháp bảo mật bắt buộc cho mọi dự án doanh nghiệp.
Hook Server-Side: Kiểm Soát Trên Repository
Server-side hook hoạt động trên remote repository, kiểm soát quyền push từ phía client. Điều này đặc biệt quan trọng cho các branch bảo vệ như main hoặc production:
#!/bin/bash
# pre-receive hook: Kiểm tra branch protection
while read oldrev newrev refname; do
branch=$(echo $refname | sed 's|refs/heads/||')
if [ "$branch" = "main" ] || [ "$branch" = "production" ]; then
# Kiểm tra commit message format
if ! git log --format=%s $oldrev..$newrev | grep -qE "^(feat|fix|docs|style|refactor|test|chore): "; then
echo "Commit message on $branch must follow Conventional Commits format!"
exit 1
fi
fi
done
Best Practices Cho Git Hooks
Để sử dụng Git Hooks hiệu quả trong dự án thực tế, tuân thủ các nguyên tắc sau:
- Giữ hook nhẹ: Hook chạy chậm sẽ làm developer khó chịu. Chỉ kiểm tra những gì cần thiết, không chạy cả test suite trong pre-commit.
- Có message rõ ràng: Khi hook từ chối commit, thông báo lỗi phải cụ thể, chỉ ra cách khắc phục.
- Không dùng hook cho bảo mật quan trọng: Hook client-side có thể bị bỏ qua (git commit –no-verify). Bảo mật thật sự phải ở server-side.
- Tài liệu hóa: Ghi rõ trong README project những hook đang được sử dụng và mục đích của chúng.
Kết Luận
Git Hooks là hàng rào bảo vệ đầu tiên cho chất lượng code. Bắt đầu với pre-commit đơn giản (linting + formatting), sau đó mở rộng sang kiểm tra secret, test tự động, và phân tích bảo mật. Kết hợp Husky để quản lý dễ dàng hơn trong team, và pre-receive hook trên server để đảm bảo mọi lần push đều đạt tiêu chuẩn. Đầu tư thiết lập Git Hooks đúng cách giúp tiết kiệm hàng trăm giờ gỡ lỗi và nâng cao chất lượng sản phẩm phần mềm.
Tài liệu tham khảo: Git Documentation, Husky, git-secrets.
