Git Hooks: Tự Động Hóa Quy Trình Trong Kho Mã Nguồn

Git Hooks: Tự Động Hóa Quy Trình Trong Kho Mã Nguồn

Git hooks là script tự động chạy khi một sự kiện cụ thể xảy ra trong repository Git. Chúng cho phép bạn kiểm soát quality code, enforce quy tắc team, và tự động hóa các tác vụ lặp đi lặp lại — ngay trong workflow hàng ngày của lập trình viên. Dù bạn làm việc solo hay trong team lớn, Git hooks giúp loại bỏ các lỗi phổ biến trước khi chúng đi vào codebase.

Khái niệm git hooks ban đầu được giới thiệu từ Git 1.3 năm 2005. Kể từ đó, chúng đã trở thành một phần không thể thiếu trong workflow phát triển phần mềm hiện đại. Các công ty như Google, Microsoft, và GitHub đều sử dụng hooks rộng rãi trong quy trình CI/CD của họ.

Git version control

Git Hook Là Gì?

Git hook là script đặt trong thư mục .git/hooks/. Mỗi hook tương ứng một sự kiện Git: commit, push, merge, nhận code (receive-pack), checkout,… Khi sự kiện xảy ra, Git tự động gọi hook tương ứng. Nếu hook trả về mã lỗi khác 0, Git sẽ hủy sự kiện đó và thông báo cho người dùng.

Các hook phổ biến nhất trong thực tế:

  • pre-commit: Chạy trước khi commit — kiểm tra lint, format code, scan secrets (API keys, passwords).
  • commit-msg: Kiểm tra format commit message (ví dụ: bắt buộc prefix feat/fix/docs/chore theo Conventional Commits).
  • pre-push: Chạy trước khi push lên remote — chạy test suite, tránh push code lỗi.
  • post-commit: Chạy sau khi commit thành công — auto tag, notify Slack/Discord.
  • post-receive: Chạy trên server sau khi nhận push — trigger deployment tự động.
  • prepare-commit-msg: Sửa đổi message trước khi editor mở.

Cấu Hình Git Hook Đơn Giản

Tạo file hook trong .git/hooks/ và đặt quyền execute. Ví dụ, pre-commit kiểm tra không có console.log:

#!/bin/bash
# pre-commit: kiểm tra không có console.log trong production code
FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '.js$')

if [ -z "$FILES" ]; then
    exit 0
fi

for file in $FILES; do
    if grep -q 'console.log' "$file"; then
        echo "ERROR: $file chứa console.log. Xoá trước khi commit."
        exit 1
    fi
done
chmod +x .git/hooks/pre-commit

Sau khi đặt quyền execute, hook sẽ tự động chạy mỗi khi bạn chạy git commit. Nếu code có lỗi, commit sẽ bị chặn với thông báo rõ ràng.

Git hooks terminal

Dùng Husky Quản Lý Hook Dễ Hơn

Git hook mặc định nằm trong .git/ — thư mục ẩn, không track được trong repo và không chia sẻ cho team. Husky giải quyết vấn đề này bằng cách quản lý hook từ package.json hoặc .husky/ directory:

// package.json
{
  "scripts": {
    "prepare": "husky install"
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "pre-push": "npm test"
    }
  }
}

Lợi ích của Husky so với git hook thuần:

  • Hook version cùng code — chia sẻ cho cả team qua Git
  • Dễ cài đặt: npm install husky --save-dev rồi npx husky install
  • Hỗ trợ Git hooks framework — dễ dàng thêm/bớt hook
  • Tích hợp tốt với lint-staged để chỉ lint files thay đổi (tiết kiệm thời gian)
  • Hỗ trợ Windows, macOS, Linux

Ví Dụ Thực Tế: Prettier + ESLint Trước Mỗi Commit

Kết hợp Husky, lint-staged, Prettier và ESLint cho workflow hoàn chỉnh — code luôn sạch trước khi vào repo:

// package.json
{
  "scripts": {
    "lint": "eslint . --fix",
    "format": "prettier --write ."
  },
  "devDependencies": {
    "husky": "^8.0.0",
    "lint-staged": "^14.0.0",
    "prettier": "^3.0.0",
    "eslint": "^8.0.0"
  },
  "lint-staged": {
    "*.{js,ts,jsx,tsx}": [
      "prettier --write",
      "eslint --fix",
      "git add"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  }
}

Mỗi lần commit, Prettier auto format code theo chuẩn, ESLint fix lỗi lint, rồi mới cho commit thành công. Code team luôn đồng nhất, không cần ai nhắc nhở. Ví dụ thêm: kiểm tra không có debugger.

Kết Luận

Git hooks là công cụ nhỏ nhưng ảnh hưởng lớn đến quality code. Thiết lập đúng ngay từ đầu tiết kiệm hàng giờ fix lỗi sau này. Dùng Husky để quản lý dễ dàng hơn, kết hợp với lint-staged để tối ưu hiệu suất. Đọc thêm tại git-scm.com hoặc tài liệu Husky trên GitHub.

Advanced: Hooks Cho CI/CD Pipeline

Ngoài các hooks cơ bản, bạn có thể dùng hooks để xây dựng pipeline CI/CD đơn giản ngay trên máy local:

  • post-commit: Gửi build notification đến Slack khi commit thành công
  • pre-push: Chạy test suite đầy đủ trước khi push, kiểm tra coverage
  • post-merge: Tự động cài đặt dependency sau khi pull từ remote
  • post-checkout: Tự động format code theo tiêu chuẩn team khi checkout branch

Ví dụ, dùng post-receive hook trên server để auto-deploy:

#!/bin/bash
# post-receive: auto-deploy khi push lên production
while read oldrev newrev ref; do
    if [ "$ref" = "refs/heads/production" ]; then
        git --work-tree=/var/www/app --git-dir=/opt/app.git checkout -f production
        echo "Deployment complete" | mail -s "Deploy Success" [email protected]
    fi
done

Đây là pattern phổ biến cho deployment không cần CI tool phức tạp. Nhiều startup nhỏ dùng phương pháp này cho dự án đầu tiên.

Mẹo Sử Dụng Git Hooks Hiệu Quả

  • Luôn kiểm tra hook bằng cách chạy trực tiếp: .git/hooks/pre-commit
  • Đặt thời gian timeout cho hooks chạy lâu (test suite có thể mất nhiều phút)
  • Không đặt hooks heavy trong pre-commit — người dùng sẽ bỏ qua và xóa .git/hooks
  • Dùng skiphooks flag khi cần bỏ qua: git commit --no-verify
  • Document rõ ràng trong README repo về hooks đang sử dụng
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

20 Phím Tắt Dòng Lệnh Linux Tăng Năng Suất Cho Lập Trình Viên

20 Phím Tắt Dòng Lệnh Linux Tăng Năng Suất Cho Lập Trình Viên Dòng lệnh Linux (terminal) là công cụ mạnh mẽ nhất trong tay lập trình viên. Không giao…

Xem thêm
Rust programming language logo

Rust: Ngôn Ngữ Lập Trình An Toàn Bộ Nhớ Đáng Học

Rust: Ngôn Ngữ Lập Trình An Toàn Bộ Nhớ Đáng Học Năm 2026 Rust là một ngôn ngữ lập trình hiện đại nổi bật với khả năng bảo đảm an…

Xem thêm

C++ 23: Những Tính Năng Mới Mỗi Lập Trình Viên Cần Biết

C++ 23: Những Tính Năng Mới Mỗi Lập Trình Viên Cần Biết Tiêu chuẩn C++ 23 (ISO/IEC 14882:2024) là một bước tiến quan trọng trong sự phát triển của ngôn…

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