Git Hooks: Tự Động Hóa Kiểm Tra Code Trước Khi Commit Và Push

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.

Nhà phát triển đang làm việc với Git hooks trong terminal
Nhà phát triển đang làm việc với Git hooks trong terminal

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.
Biểu tượng Git và GitHub trên laptop lập trình
Biểu tượng Git và GitHub trên laptop lập trình

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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Thiết Lập Môi Trường Phát Triển Python Với Pyenv Và Venv

Thiết Lập Môi Trường Phát Triển Python Với Pyenv Và Venv Python là ngôn ngữ phổ biến cho việc phát triển phần mềm, dữ liệu và trí tuệ nhân tạo….

Xem thêm

Lean 4: Ngôn ngữ lập trình chứng minh định lý hiện đại

Lean 4: Ngôn ngữ lập trình chứng minh định lý hiện đại Lean 4 là hệ thống chứng minh định lý và ngôn ngữ lập trình được phát triển bởi…

Xem thêm

Kotlin Coroutines: Hướng Dẫn Lập Trình Bất Đồng Bộ Trên Android

Kotlin Coroutines: Hướng Dẫn Lập Trình Bất Đồng Bộ Trên Android Kotlin Coroutines là công cụ mạnh mẽ giúp lập trình viên viết code bất đồng bộ một cách dễ…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất