วิธีตั้งค่า Git Hooks เพื่ออัตโนมัติกระบวนการก่อนและหลังคอมมิตในโปรเจกต์ของคุณ

ที่มาภาพ: 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 แยกจากโครงการหลัก
เครื่องมือภาษาหลักการติดตั้งจุดเด่น
huskyJavaScript/Node`npm install husky --save-dev`กำหนด Hook ด้วยสคริปต์ npm, รองรับ CI
pre‑commitPython`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

Related

บทความที่เกี่ยวข้อง

วิธีตั้งค่าและใช้ Rustup จัดการเวอร์ชันของ Rust บน Windows, macOS และ Linux อย่างปลอดภัยGrowth
8 กรกฎาคม 2569 เวลา 19:00

วิธีตั้งค่าและใช้ Rustup จัดการเวอร์ชันของ Rust บน Windows, macOS และ Linux อย่างปลอดภัย

Rustup เป็นเครื่องมือจัดการ Rust toolchain อย่างเป็นทางการ ช่วยให้คุณติดตั้งและสลับเวอร์ชันของคอมไพเลอร์ได้อย่างปลอดภัยบน Windows, macOS และ Linux การใช้ Rustup ทำให้ไม่ต้องกังวลเรื่อง dependency ขัดก…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ7 นาที
วิธีตั้งค่า Rclone เพื่อสำรองข้อมูลอัตโนมัติข้ามคลาวด์หลายผู้ให้บริการGrowth
8 กรกฎาคม 2569 เวลา 11:30

วิธีตั้งค่า Rclone เพื่อสำรองข้อมูลอัตโนมัติข้ามคลาวด์หลายผู้ให้บริการ

**บทความนี้จะสอนการตั้งค่า Rclone เพื่อสำรองข้อมูลอัตโนมัติข้ามคลาวด์หลายผู้ให้บริการ ทั้งการติดตั้ง การกำหนด Remote และการทำงานแบบ Schedule อย่างง่าย ๆ**

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ8 นาที
วิธีตั้งค่า CI / CD อัตโนมัติสำหรับแอป Flutter ด้วย GitHub Actionsบนคลาวด์ฟรีGrowth
7 กรกฎาคม 2569 เวลา 20:30

วิธีตั้งค่า CI / CD อัตโนมัติสำหรับแอป Flutter ด้วย GitHub Actionsบนคลาวด์ฟรี

การทำ **CI/CD** สำหรับแอป Flutter ช่วยให้โค้ดถูกตรวจสอบและปล่อยเวอร์ชันใหม่โดยอัตโนมัติ ลดความผิดพลาดจากขั้นตอน manual และเร่งเวลานำผลิตภัณฑ์สู่ผู้ใช้ได้เร็วขึ้น บทความนี้จะสอนวิธีตั้งค่า GitHub Actio…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ6 นาที
วิธีตั้งค่าและใช้งาน Grafana กับ Prometheus บน Raspberry Pi เพื่อมอนิเตอร์ระบบแบบเรียลไทม์Growth
7 กรกฎาคม 2569 เวลา 19:00

วิธีตั้งค่าและใช้งาน Grafana กับ Prometheus บน Raspberry Pi เพื่อมอนิเตอร์ระบบแบบเรียลไทม์

การมอนิเตอร์ระบบแบบเรียลไทม์บน Raspberry Pi ไม่ต้องอาศัยเครื่องแม่ข่ายราคาแพง เพียงติดตั้ง **Prometheus** เป็นตัวเก็บเมตริกและ **Grafana** แสดงผลก็เพียงพอ บทความนี้จะสอนขั้นตอนตั้งค่า ตั้งค่าขั้นพื้นฐ…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ9 นาที
คัดลอกลิงก์แล้ว!