
ที่มาภาพ: Unknown Source
วิธีตั้งค่า Git Hook เพื่อตรวจสอบคุณภาพโค้ดก่อน Commit อย่างปลอดภัย
⚡ สรุป 30 วิ
Git Hook คือสคริปต์ที่ทำงานอัตโนมัติเมื่อเกิดเหตุการณ์บางอย่างในระบบเวอร์ชันคอนโทรล เช่น `pre‑commit` หรือ `post‑merge` การใช้ Hook ช่วยให้เราตรวจสอบคุณภาพโค้ดก่อนที่การเปลี่ยนแปลงจะถูกบันทึกเข้าสู่ r…
ทำความเข้าใจ Git Hook — Git Hook Overview
Git Hook คือสคริปต์ที่ทำงานอัตโนมัติเมื่อเกิดเหตุการณ์บางอย่างในระบบเวอร์ชันคอนโทรล เช่น `pre‑commit` หรือ `post‑merge` การใช้ Hook ช่วยให้เราตรวจสอบคุณภาพโค้ดก่อนที่การเปลี่ยนแปลงจะถูกบันทึกเข้าสู่ repository ทำให้ทีมพัฒนาสามารถควบคุมมาตรฐานได้อย่างต่อเนื่อง
- ประโยชน์หลัก: ป้องกันโค้ดผิดพลาดจากการ commit, ลดความเสี่ยงของบั๊กใน production
- ทำงานแบบ local: ไม่ต้องเชื่อมต่ออินเทอร์เน็ต จึงเร็วและปลอดภัย
- กำหนดได้หลายประเภท: `pre‑commit`, `prepare‑commit‑msg`, `post‑checkout` ฯลฯ
เตรียมเครื่องมือพื้นฐาน — Prerequisites
ก่อนจะตั้งค่า Hook ควรตรวจสอบว่าระบบของคุณพร้อมใช้งานแล้วหรือยัง
- ระบบปฏิบัติการที่รองรับสคริปต์ Bash, PowerShell หรือ Python
- ติดตั้ง Git เวอร์ชัน 2.20 ขึ้นไป (ใช้ `git --version` ตรวจสอบ)
- เลือกเครื่องมือ lint/formatter ที่ต้องการ เช่น ESLint, Pylint, Prettier
**Tip: หากทีมทำงานหลายภาษา ควรจัดทำ Hook แยกไฟล์ตามภาษาหรือสร้างสคริปต์อุ่น ๆ ที่เรียกใช้ lint ของแต่ละภาษาโดยอัตโนมัติ
สร้าง Hook แบบ pre‑commit — Pre‑commit Hook Setup
การตั้งค่า `pre‑commit` ทำได้ง่ายเพียงไม่กี่ขั้นตอน
- **ขั้นตอนที่ 1: เข้าโฟลเดอร์ `.git/hooks` ของโปรเจค
- **ขั้นตอนที่ 2: สร้างไฟล์ใหม่ชื่อ `pre-commit` (ไม่มีนามสกุล)
- **ขั้นตอนที่ 3: ให้สิทธิ์ทำงานโดยใช้คำสั่ง `chmod +x pre-commit`
- **ขั้นตอนที่ 4: ใส่โค้ดตรวจสอบคุณภาพลงในไฟล์ เช่น เรียก lint หรือรัน unit test
```bash #!/bin/bash git diff --cached --name-only --diff-filter=ACM | grep '\.js$' | while read file; do npx eslint "$file" if [ $? -ne 0 ]; then echo "ไม่ ESLint พบข้อผิดพลาดใน $file" exit 1 fi done ```
- **ขั้นตอนที่ 5: บันทึกและทดสอบโดยทำการ `git add` แล้ว `git commit` หาก lint ผ่าน Hook จะให้ commit ต่อได้
**Warning: อย่าลืมตรวจสอบว่าเส้นทางของเครื่องมือ (เช่น `npx eslint`) อยู่ใน PATH ของระบบ มิฉะนั้น Hook จะล้มเหลวและบล็อกการ commit ทั้งหมด
ตัวอย่างสคริปต์ตรวจสอบคุณภาพโค้ด — Sample Linter Script
ต่อไปเป็นตัวอย่างสคริปต์ที่รองรับหลายภาษาโดยใช้ Python เป็นตัวกลาง
```python #!/usr/bin/env python3 import subprocess, sys, os
def run_cmd(cmd): result = subprocess.run(cmd, shell=True) return result.returncode changed_files = subprocess.check_output( "git diff --cached --name-only --diff-filter=ACM", shell=True ).decode().splitlines()
for file in changed_files: if file.endswith('.py'): rc = run_cmd(f'pylint {file}') elif file.endswith('.js'): rc = run_cmd(f'npx eslint {file}') else: continue if rc != 0: print(f'ไม่ ตรวจสอบล้มเหลว: {file}') sys.exit(1)
print('ใช่ ทั้งหมดผ่านการตรวจสอบ') ```
- ข้อดี: เพียงไฟล์เดียวสามารถจัดการหลายภาษาพร้อมกัน
- ข้อเสีย: ต้องติดตั้ง Python และเครื่องมือ lint แต่ละตัวใน environment
เชื่อมต่อกับ CI/CD เพื่อความปลอดภัยเพิ่ม — CI Integration
แม้ Hook ทำงานที่เครื่อง local แล้ว การตรวจสอบบนเซิร์ฟเวอร์ CI ยังจำเป็นเพื่อให้มั่นใจว่าทุก commit ที่เข้าสู่ main branch ผ่านมาตรฐานเดียวกัน
- เพิ่มขั้นตอน `lint` ใน pipeline (GitHub Actions, GitLab CI, Jenkins)
- ตั้งค่า branch protection ให้บังคับผ่านการตรวจสอบจาก CI ก่อน merge
- ใช้ไฟล์คอนฟิกเดียว (`.eslintrc.js`, `.pylintrc`) ทั้งใน local Hook และ CI เพื่อความสอดคล้อง
| เครื่องมือ | ทำงานที่ Local | ทำงานบน CI | รองรับหลายภาษา |
|---|---|---|---|
| ESLint | ใช่ | ใช่ | (JS/TS) |
| Pylint | ใช่ | ใช่ | (Python) |
| Prettier | ใช่ | ใช่ | (หลายภาษา) |
Tip: หากต้องการความเร็วสูงสุด ให้ใช้ caching** ของ dependencies ใน CI เช่น `actions/cache` เพื่อไม่ให้ติดตั้ง lint ทุกครั้ง
การจัดการและอัปเดต Hook อย่างมีประสิทธิภาพ — Hook Management
เมื่อโปรเจคเติบโต จำนวนไฟล์ Hook อาจเพิ่มขึ้น ควรจัดระบบให้ดูแลง่าย
- เก็บสคริปต์หลักไว้ในโฟลเดอร์ `hooks/` ของ repository แล้วใช้ symlink ไปที่ `.git/hooks`
- ใช้เครื่องมืออย่าง pre‑commit (Python package) เพื่อกำหนด Hook ผ่านไฟล์ `.pre-commit-config.yaml`
- ตรวจสอบเวอร์ชันของ Hook ด้วย Git tags หรือ version bump ในไฟล์ config
```yaml repos:
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.0.0 hooks:
- id: eslint
files: \.js$ ```
ขั้นตอนการใช้งาน
- ติดตั้ง: `pip install pre-commit && pre-commit install`
- อัปเดต: `pre-commit autoupdate`
**Warning: อย่าให้ Hook ทำงานหนักเกินไป (เช่น รัน test ทั้งชุด) เพราะจะทำให้การ commit ช้าลงอย่างเห็นได้ชัด
สรุป — Summary
- Git Hook เป็นวิธีง่าย ๆ ที่ช่วยตรวจสอบคุณภาพโค้ดก่อน commit โดยไม่ต้องพึ่ง CI เสมอ
- ตั้งค่า `pre‑commit` ด้วยสคริปต์ Bash หรือ Python เพื่อรัน lint ของภาษาที่ใช้
- ควรใช้เครื่องมือ pre‑commit เพื่อจัดการ Hook อย่างเป็นระบบและทำให้ทีมสามารถอัปเดตได้ง่าย
- เชื่อมต่อกับ CI/CD และตั้งค่า branch protection เพื่อความปลอดภัยระดับองค์กร
สิ่งที่ควรจำ
- ตรวจสอบ PATH ของ lint tool ก่อนใช้งานใน Hook
- ให้ Hook ทำงานเร็วที่สุดโดยเลือกตรวจสอบเฉพาะไฟล์ที่เปลี่ยนแปลง
- ใช้ไฟล์คอนฟิกเดียวกันบน local และ CI เพื่อความสอดคล้อง
- ควบคุมเวอร์ชัน Hook ด้วยระบบจัดการแบบเดียวกับโค้ดหลัก
ด้วยขั้นตอนเหล่านี้ ทีมของคุณจะได้ กระบวนการ commit ที่ปลอดภัย ลดบั๊กที่เข้าสู่ production และรักษามาตรฐานคุณภาพโค้ดอย่างต่อเนื่อง.
แชร์บทความนี้:
ชอบบทความแบบนี้?
สมัคร AI Automate Weekly Newsletter — รับเคล็ดลับ AI + how-to ใหม่
ทุกสัปดาห์ตรงถึง inbox ฟรี ไม่มีสแปม
แหล่งข่าวต้นฉบับ
- ชื่อต้นฉบับ
- วิธีตั้งค่า Git Hook เพื่อตรวจสอบคุณภาพโค้ดก่อน Commit อย่างปลอดภัย
- ผู้เขียน
- กองบรรณาธิการ Thai Tech News
- แหล่ง
- บทความต้นฉบับ Thai Tech News · ช่วยร่างด้วย AI, เรียบเรียง/ตรวจสอบโดยกองบรรณาธิการ
- วันที่เผยแพร่
- 21 สิงหาคม 2569 เวลา 10:50



