
ที่มาภาพ: Unknown Source
วิธีตั้งค่า Git Hooks เพื่ออัตโนมัติกระบวนการก่อนและหลังคอมมิตในโปรเจกต์ของคุณ
⚡ สรุป 30 วิ
Git Hooks เป็นสคริปต์ที่ทำงานอัตโนมัติเมื่อเกิดเหตุการณ์ต่าง ๆ ใน Git เช่น ก่อนคอมมิตหรือหลังคอมมิต การใช้ Hook ช่วยบังคับกฎคุณภาพโค้ดและทำกระบวนการเสริมได้โดยไม่ต้องจำคำสั่งด้วยมือ บทความนี้จะพาคุณตั…
ภาพรวม — Overview
Git Hooks เป็นสคริปต์ที่ทำงานอัตโนมัติเมื่อเกิดเหตุการณ์ต่าง ๆ ใน Git เช่น ก่อนคอมมิตหรือหลังคอมมิต การใช้ Hook ช่วยบังคับกฎคุณภาพโค้ดและทำกระบวนการเสริมได้โดยไม่ต้องจำคำสั่งด้วยมือ บทความนี้จะพาคุณตั้งค่า pre‑commit และ post‑commit Hooks อย่างละเอียด พร้อมตัวอย่างที่พร้อมใช้งานในโปรเจ็กต์ของคุณ
ทำความเข้าใจ Git Hooks — Understanding Git Hooks
Hook ทั้งหมดอยู่ในโฟลเดอร์ `.git/hooks` ของรีโพซิทอรี แต่ละไฟล์เป็นสคริปต์เชลล์ (หรือภาษาอื่นที่กำหนด) ที่เรียกใช้โดย Git เมื่อเหตุการณ์ที่สอดคล้องเกิดขึ้น
- pre‑commit ทำงานก่อน Git สร้างคอมมิตจริง
- post‑commit ทำงานหลังจากคอมมิตเสร็จสิ้นแล้ว
**Tip: อย่าแก้ไขไฟล์ตัวอย่าง (`*.sample`) โดยตรง ให้สร้างไฟล์ใหม่หรือเปลี่ยนชื่อไฟล์ที่ต้องการใช้งาน
การตั้งค่า Hook ขั้นพื้นฐาน — Basic Hook Setup
เริ่มต้นด้วยการทำให้สคริปต์เป็นไฟล์ปฏิบัติได้และตรวจสอบว่า Git รู้จัก
- **ขั้นตอนที่ 1: ไปยังโฟลเดอร์ `.git/hooks` ของโปรเจ็กต์
- **ขั้นตอนที่ 2: คัดลอกไฟล์ `pre‑commit.sample` เป็น `pre‑commit` (หรือสร้างไฟล์ใหม่)
- **ขั้นตอนที่ 3: ให้สิทธิ์การทำงานกับสคริปต์ด้วยคำสั่ง `chmod +x pre‑commit`
**Tip: หากใช้ Windows ให้ตั้งค่า Git Bash หรือ PowerShell เพื่อให้สคริปต์เชลล์ทำงานได้
ตัวอย่าง Pre‑Commit Hook ที่นิยมใช้ — Common Pre‑Commit Hooks
ต่อไปนี้คือสคริปต์พื้นฐานที่ช่วยตรวจสอบคุณภาพโค้ดก่อนคอมมิต
- **ขั้นตอนที่ 1: ตรวจสอบรูปแบบโค้ดด้วย `eslint` (สำหรับ JavaScript) หรือ `flake8` (สำหรับ Python)
```bash #!/bin/sh files=$(git diff --cached --name-only --diff-filter=ACM | grep '\.js$') if [ -n "$files" ]; then echo "Running ESLint..." npx eslint $files if [ $? -ne 0 ]; then echo "ESLint failed, aborting commit." exit 1 fi fi exit 0 ```
- **ขั้นตอนที่ 2: ป้องกันคอมมิตไฟล์ขนาดใหญ่เกินกว่าที่กำหนด
```bash max_size=500000 # 500 KB for file in $(git diff --cached --name-only); do if [ -f "$file" ]; then size=$(stat -c%s "$file") if [ $size -gt $max_size ]; then echo "File $file exceeds size limit of 500 KB." exit 1 fi fi done ```
- **ขั้นตอนที่ 3: ปิดการคอมมิตถ้าพบไฟล์ที่มี Tab แทน Space
```bash if git grep -I -n $'\t' --cached; then echo "Tab characters detected. Please convert to spaces." exit 1 fi ```
ตัวอย่าง Post‑Commit Hook ที่นิยมใช้ — Common Post‑Commit Hooks
หลังคอมมิตเสร็จสิ้น เราอาจต้องทำงานต่อ เช่น แจ้งทีมหรือสร้าง Tag อัตโนมัติ
- **ขั้นตอนที่ 1: ส่งข้อความแจ้งบน Slack ผ่าน Webhook
```bash #!/bin/sh commit_msg=$(git log -1 --pretty=%B) payload="{ \"text\": \"New commit in *$(basename $(git rev-parse --show-toplevel))*:\n\`$commit_msg\`\" }" curl -X POST -H 'Content-type: application/json' --data "$payload" https://hooks.slack.com/services/XXXXX/XXXXX/XXXXXXXX ```
- **ขั้นตอนที่ 2: สร้าง Tag อัตโนมัติเมื่อคอมมิตในสาขา `main`
```bash branch=$(git rev-parse --abbrev-ref HEAD) if [ "$branch" = "main" ]; then version=$(date +%Y.%m.%d.%H%M) git tag -a "v$version" -m "Auto‑generated tag for $version" git push origin "v$version" fi ```
**Tip: ตรวจสอบว่าคุณมีสิทธิ์ `push` ไปยังรีโมทก่อนใช้ขั้นตอนอัตโนมัติด้านบน
การจัดการ Hook ด้วยเครื่องมือเสริม — Managing Hooks with Tools
เขียนสคริปต์เองเป็นวิธีที่ยืดหยุ่น แต่หลายทีมเลือกใช้เครื่องมือช่วยบริหาร Hook เพื่อความสม่ำเสมอ
- husky (Node.js) ทำให้ตั้งค่า Hook ผ่าน `package.json` หรือไฟล์คอนฟิกง่าย ๆ
- pre‑commit (Python) รองรับหลายภาษาและจัดการ environment แยกจากโครงการหลัก
| เครื่องมือ | ภาษาหลัก | การติดตั้ง | จุดเด่น |
|---|---|---|---|
| husky | JavaScript/Node | `npm install husky --save-dev` | กำหนด Hook ด้วยสคริปต์ npm, รองรับ CI |
| pre‑commit | Python | `pip install pre-commit` | มีคอนฟิก YAML, รันหลาย Hook พร้อมกัน |
**Tip: ใช้ไฟล์ `.pre-commit-config.yaml` เพื่อแชร์ Hook ระหว่างสมาชิกทีมโดยไม่ต้องแก้ไขแต่ละเครื่อง
การทดสอบและดีบั๊ก Hook — Testing and Debugging Hooks
Hook ที่ทำงานผิดพลาดอาจทำให้คอมมิตหยุดชะงัก ควรตรวจสอบอย่างเป็นระบบ
- ใช้คำสั่ง `git commit --no-verify` เพื่อข้าม Hook ชั่วคราวและยืนยันว่าเหตุผลอยู่ที่ Hook หรือโค้ด
- เพิ่มบรรทัด `set -x` ที่หัวไฟล์สคริปต์เพื่อให้แสดงขั้นตอนการทำงานในเทอร์มินัล
- ตรวจสอบ Log ของระบบ (เช่น `/var/log/syslog`) หากใช้คำสั่งภายนอกที่อาจล้มเหลว
การจัดเก็บ Hook ไว้ใน Version Control — Version‑Controlling Hooks
โดยปกติไฟล์ Hook ไม่ได้อยู่ใน Git แต่เราสามารถบันทึกไว้ในโฟลเดอร์ `hooks/` ที่เป็นส่วนหนึ่งของรีโพซิทรี แล้วทำสคริปต์เชื่อมต่อ
- สร้างโฟลเดอร์ `hooks/` ที่ระดับโปรเจ็กต์และใส่ไฟล์ Hook ทั้งหมดลงไป
- เพิ่มขั้นตอนใน `post‑checkout` หรือ `pre‑commit` เพื่อลิงก์หรือคัดลอกไฟล์จาก `hooks/` ไปยัง `.git/hooks` ทุกครั้งที่คลอนรีโป
```bash #!/bin/sh cp -r hooks/* .git/hooks/ chmod +x .git/hooks/* ```
**Tip: ใส่ขั้นตอนนี้ใน CI pipeline เพื่อให้เครื่องทุกเครื่องมี Hook เวอร์ชันเดียวกันโดยอัตโนมัติ
สรุป — Summary
การตั้งค่า Git Hooks ไม่จำเป็นต้องซับซ้อน แต่สามารถเพิ่มคุณภาพโค้ดและทำงานอัตโนมัติเพิ่มประสิทธิภาพของทีมได้อย่างมาก
- **Hook ทำหน้าที่อะไร: pre‑commit ตรวจสอบก่อนคอมมิต, post‑commit ดำเนินการหลังคอมมิต
- **ขั้นตอนตั้งค่าเบื้องต้น: สร้างไฟล์ใน `.git/hooks`, ให้สิทธิ์ทำงาน (`chmod +x`) และเขียนสคริปต์ที่ต้องการ
- **ตัวอย่างใช้งานจริง: ตรวจสอบรูปแบบโค้ด, ปิดคอมมิตไฟล์ใหญ่เกินขนาด, ส่งแจ้ง Slack, สร้าง Tag อัตโนมัติ
- **เครื่องมือช่วยจัดการ: husky (Node) และ pre‑commit (Python) ทำให้ Hook สามารถแชร์และเวอร์ชันควบคุมได้ง่าย
- **ทดสอบและดีบั๊ก: ใช้ `--no-verify`, เปิดโหมด debug (`set -x`) เพื่อหาจุดผิดพลาด
- **เก็บ Hook ใน VCS: วางในโฟลเดอร์ `hooks/` แล้วทำสคริปต์คัดลอกไป `.git/hooks` ทุกครั้งที่เช็คเอาท์หรือ CI
การนำ Git Hooks ไปใช้เป็นขั้นตอนเล็ก ๆ ที่ให้ผลตอบแทนใหญ่ หากตั้งค่าและดูแลอย่างถูกต้อง ทีมของคุณจะได้ประโยชน์จากโค้ดที่สะอาดขึ้น การทำงานอัตโนมัติที่ต่อเนื่อง และความมั่นใจว่ากระบวนการสำคัญไม่พลาดหายไป.
แชร์บทความนี้:
ชอบบทความแบบนี้?
สมัคร AI Automate Weekly Newsletter — รับเคล็ดลับ AI + how-to ใหม่
ทุกสัปดาห์ตรงถึง inbox ฟรี ไม่มีสแปม
แหล่งข่าวต้นฉบับ
- ชื่อต้นฉบับ
- วิธีตั้งค่า Git Hooks เพื่ออัตโนมัติกระบวนการก่อนและหลังคอมมิตในโปรเจกต์ของคุณ
- ผู้เขียน
- กองบรรณาธิการ Thai Tech News
- แหล่ง
- บทความต้นฉบับ Thai Tech News · ช่วยร่างด้วย AI, เรียบเรียง/ตรวจสอบโดยกองบรรณาธิการ
- วันที่เผยแพร่
- 8 กรกฎาคม 2569 เวลา 19:51
- URL ต้นฉบับ
- https://thaitech.news/articles/growth-871563



