ถ้าคุณเป็นนักพัฒนาสาย WordPress ที่เพิ่งได้รับอนุมัติปลั๊กอินให้ขึ้นสู่ WordPress.org Plugin Directory คุณจะต้องพบกับความจริงข้อหนึ่งที่หนีไม่พ้น นั่นคือ… “โลกภายนอกเขาใช้ Git กันหมดแล้ว แต่ระบบหลักของ WordPress.org ยังคงบังคับให้เราส่งโค้ดผ่าน SVN (Subversion)”
ปัญหายอดฮิตที่ตามมาคือ โครงสร้างโปรเจกต์มักจะถูกวางไว้ให้โฟลเดอร์ SVN/ (ที่ดึงมาจาก WordPress Subversion) ซ้อนอยู่ข้างในโฟลเดอร์หลักที่เป็น Git Repository อีกที เพื่อความสะดวกในการทำงาน
แต่พอเราจัดการเขียนไฟล์ .gitignore ข้ามโฟลเดอร์ SVN ไปเลยเพื่อความปลอดภัย… ปรากฏว่า Git ก็มองไม่เห็นเวอร์ชันที่พร้อมปล่อยของฝั่ง SVN เลยสักนิด! ครั้นจะปล่อยให้ Git เข้ามาสแกนตรง ๆ ฐานข้อมูล Git ก็บวมเบ่งเพราะไฟล์ระบบ Temp ของ SVN (.svn) โผล่เข้ามาทำรกสายตา
วันนี้เราจะมาแชร์วิธี “เปิดประตูให้ Git เก็บเฉพาะไฟล์ซอร์สโค้ดสำคัญใน SVN แต่กรองไฟล์ขยะระบบออกไป 100%” กันครับ
🛠️ โครงสร้างโฟลเดอร์ที่เราต้องการจัดการ
สมมติว่าคุณวางโครงสร้างโปรเจกต์แบบนี้ (ซึ่งเป็นโครงสร้างที่ดีและเป็นระเบียบมากในการพัฒนาปลั๊กอิน)
my-wordpress-plugin/ (Git Main Directory)
├── .git/
├── .gitignore
├── plusmagi-tags-reindex.php (โค้ดฝั่งพัฒนาหลัก)
├── js/
│ └── plusmagi-tags-reindex.tsx
└── SVN/ (โฟลเดอร์ย่อยที่ผูกกับ WordPress.org SVN)
├── .svn/ (ไฟล์ระบบ/Metadata ของ SVN - ห้ามเก็บลง Git!)
└── trunk/
├── plusmagi-tags-reindex.php (โค้ดฝั่งเตรียมปล่อยของ)
└── js/
└── plusmagi-tags-reindex.js
📝 วิธีตั้งค่า .gitignore เพื่อผลลัพธ์ที่สมบูรณ์แบบ
ความผิดพลาดส่วนใหญ่เกิดจากการที่เรายัดคำสั่ง SVN/ ลงไปตรง ๆ ใน .gitignore ซึ่งเป็นการสั่งให้ Git ปิดประตูลงกลอนถาวร ไม่ให้เข้าไปยุ่งในโฟลเดอร์นั้นเลย
วิธีแก้ที่ถูกต้องคือ ให้ลบบรรทัด SVN/ ออก แล้วเปลี่ยนมาเจาะจงเฉพาะไฟล์ระบบแทน ด้วยการปรับแต่ง .gitignore ดังนี้:
# ============================================================================
# SVN Mirror / Metadata Configuration
# ============================================================================
# เปิดทางให้ Git เข้าไปสแกนไฟล์ในโฟลเดอร์ SVN ได้
# (ห้ามมีบรรทัด SVN/ โดด ๆ เด็ดขาด)
# ปิดตายไม่ให้ Git แอบเก็บไฟล์ระบบและ Metadata ภายในของ SVN
.svn/
**/.svn/
**/.backup/
# กันไว้ดีกว่าแก้: ปิดไม่ให้ Git เก็บโฟลเดอร์สร้างเองที่อาจจะหลุดไปอยู่ใน SVN ตอนรัน Build
SVN/**/node_modules/
SVN/**/dist/
🚀 ผลลัพธ์หลังการตั้งค่า (The Clean State)
หลังจากที่คุณปรับแต่ง .gitignore ใหม่แล้ว เมื่อลองรันคำสั่งตรวจสอบสถานะผ่าน Terminalgit status
คุณจะพบกับความฟินระดับ 100% บนหน้าจอทันที! เพราะ
- ในช่อง Untracked files: Git จะเริ่มฉลาดพอที่จะมองทะลุเข้าไปตามเก็บเฉพาะไฟล์ซอร์สโค้ดสำคัญที่อยู่ใน
SVN/trunk/เช่น ไฟล์.php,.txtหรือ.tsxที่คุณเพิ่งแก้ไขเสร็จเรียบร้อย - โฟลเดอร์ระบบ
.svnหายไปไหน?: โฟลเดอร์ซ่อนและไฟล์ Temp ทั้งหมดของฝั่ง SVN (ซึ่งปกติจะมีขนาดใหญ่และซ้ำซ้อนมาก) จะถูกกรองทิ้งไปอย่างถาวร ไม่โผล่มาให้รกหูรกตาหรือทำให้ฐานข้อมูล Git ของคุณบวมเบ่ง
💡 ประโยชน์ของการยอมให้เกิด “ความซ้ำซ้อนที่ตั้งใจ”
นักพัฒนาบางคนอาจจะแย้งว่า “แบบนี้ใน Git ก็จะมีโค้ด 2 ชุดน่ะสิ? ชุดนึงอยู่ Root ด้านนอก อีกชุดอยู่ใน SVN”
ขอบอกเลยครับว่า นี่คือข้อดีขั้นสุดในการวาง Workflow สาย WordPress Plugin! เพราะ
- ฝั่ง Git Root (ด้านนอก): ทำหน้าที่เป็นสนามเด็กเล่น (Development Sandbox) ให้คุณแก้โค้ด รันเทส หรือ refactor โค้ดได้อย่างอิสระโดยไม่ต้องกังวล
- ฝั่ง SVN/trunk (ด้านใน): ทำหน้าที่เป็นพื้นที่เตรียมปล่อยของ (Staging Area) เมื่อคุณมั่นใจว่าโค้ดด้านนอกนิ่งและเสถียร 100% แล้ว ค่อยสั่งก๊อปปี้หรือคอมไพล์ตัวจบโยนเข้ามาในโฟลเดอร์นี้ เพื่อเตรียมรันคำสั่ง
svn commitส่งขึ้น WordPress.org เท่านั้น
การทำแบบนี้ทำให้ประวัติการ Commit บน Git (git log) ของคุณสามารถบันทึกไทม์ไลน์ได้อย่างชัดเจนและเป็นระเบียบมาก ว่าโค้ดฝั่งพัฒนาถูกอัปเดตไปถึงไหน และโค้ดเวอร์ชันทางการที่ปล่อยให้คนทั่วโลกดาวน์โหลดถูกส่งขึ้นระบบเมื่อไหร่… โดยไม่มีไฟล์ขยะระบบ SVN มาทำประวัติ Git เสียเลยสักบรรทัดเดียว!
ลองเอาเทคนิคนี้ไปปรับใช้กับโปรเจกต์ของคุณดูครับ คลีน สบายตา และจัดการง่ายขึ้นแน่นอน! 🚀
#WordPress #Git #SVN #WebDevelopment #CleanCode #DeveloperTips
อ่านเพิ่มเติม