วิธีใช้ .gitignore: การจัดการไฟล์ที่ต้องการยกเว้นจากการติดตาม
ในบทความที่ผ่านมา เราได้เรียนรู้การใช้งานพื้นฐานของ Git และ GitHub กันไปแล้ว แต่ในการทำโปรเจกต์จริง เมื่อรันคำสั่ง `git status` คุณเคยเจอปัญหาที่ไฟล์ที่ระบบปฏิบัติการสร้างขึ้นอัตโนมัติ (เช่น `.DS_Store` ของ Mac) หรือข้อมูลที่เป็นความลับเช่นรหัสผ่าน หรือไฟล์ที่เกี่ยวข้องกับ dependency จำนวนมาก (เช่น `node_modules`) แสดงขึ้นมาเต็มไปหมด จนทำให้สับสนว่า "จำเป็นต้องจัดการไฟล์ทั้งหมดนี้เลยเหรอ?" หรือไม่?
ในบทความนี้ เราจะมาอธิบายอย่างละเอียดเกี่ยวกับวิธีใช้ไฟล์ "`.gitignore`" เพื่อยกเว้นไฟล์และโฟลเดอร์ที่ไม่จำเป็นต้องอยู่ภายใต้การจัดการของ Git หรือไม่ควรจะอยู่ ออกจากการติดตามโดยเจตนา การใช้ `.gitignore` อย่างถูกต้องจะช่วยให้ Repository ของคุณสะอาดและสามารถจัดการโปรเจกต์ได้อย่างปลอดภัย
.gitignore คืออะไร? ทำไมต้องยกเว้นไฟล์?
`.gitignore` ตามชื่อของมัน คือไฟล์ข้อความธรรมดาที่ใช้สำหรับระบุรายการไฟล์และโฟลเดอร์ที่ต้องการให้ Git "เพิกเฉย (ignore)" การวางไฟล์นี้ไว้ที่ไดเรกทอรีรากของโปรเจกต์ จะทำให้ Git ไม่นำไฟล์ที่ตรงกับรูปแบบที่ระบุไว้มาแสดงใน `git status` และไม่นำไปเป็นเป้าหมายของ `git add`
แล้วทำไมเราต้องยกเว้นไฟล์ด้วยล่ะ? มีเหตุผลหลักอยู่ 3 ข้อ:
- 1. ป้องกันการปะปนของข้อมูลที่เป็นความลับ: การอัปโหลดไฟล์ตั้งค่า (เช่น `.env`) ที่มีรหัสผ่านฐานข้อมูลหรือ API Key ขึ้นไปยัง Public Repository ของ GitHub โดยไม่ได้ตั้งใจ อาจนำไปสู่ปัญหาด้านความปลอดภัยที่ร้ายแรงได้
- 2. การยกเว้นไฟล์ที่สร้างขึ้นอัตโนมัติ: ไฟล์ตั้งค่าที่ OS หรือ Editor สร้างขึ้นอัตโนมัติ (เช่น `.DS_Store`, `.vscode/`), โฟลเดอร์ dependency จำนวนมหาศาลที่เกิดจากการ `npm install` (เช่น `node_modules/`), หรือไฟล์ที่สร้างขึ้นตอน build (เช่น `dist/`) ไม่จำเป็นต้องรวมอยู่ในการควบคุมเวอร์ชัน เพราะสามารถสร้างขึ้นใหม่ได้ในสภาพแวดล้อมอื่น
- 3. ทำให้ Repository สะอาดอยู่เสมอ: การจำกัดขอบเขตการควบคุมเวอร์ชันให้เหลือเพียงซอร์สโค้ดที่มนุษย์เขียนขึ้นจริงๆ จะทำให้ Repository ดูสะอาดและเข้าใจง่ายขึ้น ซึ่งช่วยให้ผู้อื่นเข้าร่วมโปรเจกต์ได้ง่ายขึ้น
วิธีการเขียนและกฎพื้นฐานของ .gitignore
การเขียน `.gitignore` นั้นง่ายมาก เพียงแค่สร้างไฟล์ชื่อ `.gitignore` ในไดเรกทอรีรากของโปรเจกต์ (ที่เดียวกับโฟลเดอร์ `.git`) แล้วเขียนชื่อไฟล์หรือโฟลเดอร์ที่ต้องการยกเว้นลงไปทีละบรรทัด
ตัวอย่างการเขียนเบื้องต้น:
# บรรทัดที่ขึ้นต้นด้วย '#' จะถือว่าเป็นคอมเมนต์
# ระบุชื่อไฟล์ที่ต้องการยกเว้นโดยตรง
debug.log
config_secret.php
# ยกเว้นทั้งไดเรกทอรี (ใส่หรือไม่ใส่เครื่องหมายทับที่ท้ายก็ได้)
node_modules/
dist
# ยกเว้นไฟล์ทั้งหมดที่มีนามสกุลที่ระบุ
*.log
*.tmp
# กฎข้อยกเว้น: ใช้ '!'
# เพิกเฉยทุกอย่างในไดเรกทอรี logs แต่ให้ติดตาม important.log
logs/
!logs/important.log
สามารถใช้เครื่องหมาย Wildcard (`*`) ได้ ทำให้การตั้งค่ามีความยืดหยุ่น สำหรับรายการไฟล์ที่ควรยกเว้นโดยทั่วไปในทุกโปรเจกต์ คุณสามารถสร้างได้อย่างง่ายดายจากเว็บไซต์อย่าง gitignore.io ซึ่งเป็นประโยชน์อย่างมาก
ปฏิบัติจริง! ขั้นตอนการสร้าง `.gitignore` เพื่อเพิกเฉยไฟล์
ต่อไป เรามาสร้างไฟล์ `.gitignore` จริงๆ แล้วตรวจสอบดูว่าไฟล์ที่ไม่จำเป็นจะถูกเพิกเฉยจากการติดตามหรือไม่
ขั้นตอนที่ 1: สร้างไฟล์ `.gitignore`
ก่อนอื่น ให้สร้างไฟล์ `.gitignore` ในไดเรกทอรีรากของโปรเจกต์ของคุณ เนื่องจากชื่อไฟล์ขึ้นต้นด้วยจุด การสร้างผ่าน GUI ของ File Explorer อาจทำได้ยาก การใช้คำสั่งใน Terminal (หรือ Git Bash) จึงเป็นวิธีที่แน่นอนที่สุด
touch .gitignore
ขั้นตอนที่ 2: ระบุไฟล์และโฟลเดอร์ที่ต้องการยกเว้น
เปิดไฟล์ `.gitignore` ที่สร้างขึ้นด้วย Text Editor แล้วลองเขียนรายการที่มักจะถูกยกเว้นในการพัฒนาเว็บลงไป
# ไฟล์ของ OS / Editor
.DS_Store
.vscode/
# Dependencies
node_modules/
# ไฟล์ Log
*.log
npm-debug.log*
# Environment variables
.env
หลังจากแก้ไขไฟล์แล้ว อย่าลืมบันทึก
ขั้นตอนที่ 3: คอมมิตไฟล์ `.gitignore` เอง
"กฎการยกเว้น" นี้เป็นการตั้งค่าที่สำคัญที่ควรแชร์ให้กับสมาชิกทุกคนในทีม ดังนั้น ไฟล์ `.gitignore` เองก็ควรถูกรวมอยู่ในการจัดการของ Git และทำการคอมมิตด้วย
git add .gitignore
git commit -m "เพิ่มไฟล์ .gitignore"
ขั้นตอนที่ 4: ตรวจสอบการทำงาน
มาดูกันว่าไฟล์จะถูกเพิกเฉยจริงหรือไม่ ลองสร้างไฟล์ชื่อ `debug.log` ซึ่งเราได้ระบุไว้ในรายการที่ต้องเพิกเฉย
echo "This is a debug log." > debug.log
ในสถานะนี้ ลองรันคำสั่ง `git status` ดู
git status
เป็นอย่างไรบ้าง? ไฟล์ `debug.log` จะไม่ปรากฏในรายการ "Untracked files" และจะถูกเพิกเฉยโดยสมบูรณ์ เท่านี้ก็สำเร็จแล้ว!
ข้อควรระวัง: จะทำอย่างไรกับไฟล์ที่คอมมิตไปแล้ว?
สิ่งที่มือใหม่มักพลาดคือ "การคอมมิตไฟล์สำคัญไปแล้ว เพิ่งจะมาเพิ่มชื่อไฟล์ลงใน `.gitignore` ทีหลัง" แต่ `.gitignore` จะมีผลกับไฟล์ที่ยังไม่เคยถูกติดตามโดย Git มาก่อนเท่านั้น
หากคุณต้องการนำไฟล์ที่ถูกติดตามอยู่แล้ว (เช่น `secret-key.php`) ออกจากการจัดการของ Git คุณจำเป็นต้องลบไฟล์นั้นออกจากรายการติดตาม (index) ของ Git ด้วยคำสั่งต่อไปนี้
git rm --cached [ชื่อไฟล์]
คำสั่งนี้ปลอดภัยเพราะไม่ได้ลบไฟล์ออกจาก PC ของคุณ แต่เป็นเพียงการ "นำออกจากรายการติดตามของ Git" เท่านั้น หลังจากรันคำสั่งแล้ว อย่าลืมคอมมิตการเปลี่ยนแปลงนี้พร้อมกับการเปลี่ยนแปลงของ `.gitignore` ด้วย
git commit -m "หยุดการติดตามไฟล์ secret-key.php"