วิธีตั้งค่า 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

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

วิธีสร้าง Dashboard แสดงเมตริกจาก Prometheus ด้วย Grafana บน Kubernetes อย่างปลอดภัยGrowth
31 กรกฎาคม 2569 เวลา 11:30

วิธีสร้าง Dashboard แสดงเมตริกจาก Prometheus ด้วย Grafana บน Kubernetes อย่างปลอดภัย

การสร้าง Dashboard เพื่อแสดงเมตริกจาก **Prometheus** ด้วย **Grafana** บน **Kubernetes** ไม่ได้เป็นเรื่องยาก หากเข้าใจขั้นตอนและหลักการด้านความปลอดภัยอย่างถี่ถ้วน บทความนี้จะพาคุณผ่านกระบวนการตั้งแต่เต…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ9 นาที
วิธีตั้งค่าและใช้ SQLite Encryption Extension บน macOS อย่างปลอดภัยGrowth
30 กรกฎาคม 2569 เวลา 20:30

วิธีตั้งค่าและใช้ SQLite Encryption Extension บน macOS อย่างปลอดภัย

**SQLite Encryption Extension (SEE) คือส่วนขยายที่ให้ SQLite รองรับการเข้ารหัสข้อมูลโดยอัตโนมัติบนไฟล์ฐานข้อมูล การใช้งาน SEE บน macOS ต้องทำตามขั้นตอนตั้งค่าและคอมไพล์อย่างระมัดระวัง เพื่อป้องกันข้อม…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ8 นาที
วิธีสร้าง Local Development Environment แบบ Isolated ด้วย VS Code Dev Containers บน macOS อย่างปลอดภัยGrowth
30 กรกฎาคม 2569 เวลา 19:00

วิธีสร้าง Local Development Environment แบบ Isolated ด้วย VS Code Dev Containers บน macOS อย่างปลอดภัย

การพัฒนาแบบ **Isolated** ช่วยให้โค้ดทำงานในสภาพแวดล้อมเดียวกันทุกเครื่องโดยไม่ต้องกังวลเรื่อง Dependency ที่แตกต่างกัน บน macOS เราสามารถใช้ **VS Code Dev Containers** ร่วมกับ Docker เพื่อสร้าง sandbo…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ7 นาที
วิธีสร้าง Progressive Web App (PWA) ด้วย Vue.js ให้ทำงานออฟไลน์อย่างปลอดภัยGrowth
30 กรกฎาคม 2569 เวลา 11:30

วิธีสร้าง Progressive Web App (PWA) ด้วย Vue.js ให้ทำงานออฟไลน์อย่างปลอดภัย

**บทความนี้จะอธิบายวิธีสร้าง Progressive Web App (PWA) ด้วย Vue.js ให้ทำงานแบบออฟไลน์อย่างปลอดภัย**

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