ทำความรู้จักกับ Revision Control System กันก่อน !
โดย Revision Control System ( หรือเรียกว่า Version control, Source control หรือ (source) code management (SCM) ก็ได้) คือ ซอฟต์แวร์ประยุกต์ที่มีความสามารถในการติดตาม และบันทึกประวัติการเปลี่ยนแปลงที่เกิด ขึ้นเกี่ยวกับการพัฒนาระบบใดระบบหนึ่ง ซึ่งมักจะเกี่ยวกับด้านซอฟต์แวร์ โดยจะบันทึกไว้ตลอดระยะเวลาของการพัฒนาซอฟต์แวร์ พร้อมทั้งระบุเวลาและรวบรวมรูปแบบที่เปลี่ยนแปลงไปทั้งหมดที่เกิดขึ้นตลอดเวลาของการพัฒนาด้วย
โดยหลักการของ Revision Control System ส่วนใหญ่มักใช้ Optimistic Technique ก็คือการให้ผู้ใช้หลาย ๆ คนสามารถเข้าถึง (Check out) (ซึ่งในที่นี้เราจะพูดถึง source code) อันเดียวกัน แต่ละผู้ใช้สามารถแก้ไขไฟล์ต่าง ๆ ที่ดาวน์โหลดมา และสามารถอัพโหลดไฟล์ (Check in/Commit) กลับเข้าสู่ Revision Control System โดยมันจะรับผิดชอบเรื่องการตรวจความขัดแย้งกันของข้อมูล (Conflict) ว่ามีใครแก้ไขไฟล์เดียวกันหรือไม่ ถ้ามีมันก็สามารถแสดงความแตกต่าง (Diff) ระหว่างไฟล์ และ/หรือทำการรวมไฟล์ (Merge) เข้าด้วยกันได้ แต่บางครั้งบาง Revision Control System ก็ใช้หลักการ Pessimistic Technique กล่าวคือเมื่อมีคนใดในทีมพัฒนาได้ทำการเข้าถึงและกำลังนำข้อมูลนั้นไปแก้ไข หรือเปลี่ยนแปลงคนอื่น ๆ ในทีมจะไม่มีสามารถเข้าถึงและทำการเปลี่ยนแปลงข้อมูลชุดนั้นได้จนกว่าคนที่นำไปแก้ไข หรือเปลี่ยนแปลงจะทำการอัพโหลดไฟล์กลับเข้าระบบดังเดิม แต่ระหว่างนั้นสามารถเข้าไปอ่านไฟล์นั้น ๆ ได้อย่างเดียว (แต่บางครั้ง Revision Control System บางยี่ห้อก็ไม่ยินยอมให้อ่านไฟล์ด้วย ขึ้นอยู่กับว่ายี่ห้อไหนจะนิยามการทำงานแบบ Pessimistic Technique เป็นแบบใด)
โดยการเก็บข้อมูลนั้นเราต้องมีการสร้างคลังข้อมูล (Repository) ซึ่งบางครั้งคลังข้อมูลนี้จะรองรับไฟล์แบบ ASCII และ Binary Files หรือไม่ขึ้นอยู่กับซอฟต์แวร์ Revision Control System จะรองรับหรือไม่ด้วย
ตัวอย่างเช่น เราพัฒนาซอฟต์แวร์ 1 ตัว โดยในทีมีคนร่วมพัฒนา 10 คน โดยทุกคนมีสิทธิ์ในการเข้ามาใช้ Revision System Control ได้หมด และในการพัฒนาซอฟต์แวร์ครั้งนี้มีไฟล์การพัฒนาอยู่หลายร้อนไฟล์ เมื่อมี 1 ในทีมพัฒนาชื่อ A ได้นำไฟล์ kernel.c ออกไป (Check out) ทำการแก้ไขเพื่อแก้ไขข้อผิดพลาด (Bug) เมื่อทำการแก้ไขเสร็จแล้วจึงนำกลับเข้าระบบ (Check in/Commit) ซึ่งทำกันเป็นปกติ โดยก่อนทำการนำกลับเข้าระบบมักจะมีการเขียนคำอธิบายไว้เสมอว่ามีการแปลงอะไรไปบ้าง (Log) แต่พอมีการแก้ไข interface.c โดยมีในทีมมีการทำการแก้ไขพร้อม ๆ กัน 2 คน ซึ่งได้แก่คนชื่อ B และชื่อ C โดยทำการนำไฟล์ interface.c มาแก้ไข เมื่อ C นำไฟล์กลับเข้าระบบ จะทำได้ตามปกติ แต่พอ B จะนำกลับเข้าระบบจะมีการฟ้องว่าไฟล์ที่จะนำเข้าระบบเกิดความขัดแย้งของข้อมูล (Confilt) โดยทั่วไปแล้วจะทำการแสดงความแตกต่างก่อน (Diff) เพื่อดูว่าส่วนที่ตนเองแก้ไขไปนั้นมีส่วนใดที่ตรงกันหรือไม่ ถ้าไม่ตรงกันเลย และไม่มีผลกระทบกับระบบโดยรวม (เช่นแก้ไข function คนละตัวกัน) จะทำการ merge เข้าด้วยกันแล้วทำการนำเข้าระบบตามปกติ แต่ถ้ามีการแก้ไขแล้วเกิดความซ้ำซ้อนกัน มักจะทำการเปลี่ยนแปลงโค้ดโปรแกรมของตัวเองใหม่อีกครั้ง แล้วทำการนำเข้าระบบอีกครั้งนึง แต่บางครั้ง ส่วนใหญ่ถ้าไฟล์ที่เราแก้ไขนั้นเป็นไฟล์ระบบที่มีความหวั่นไหวต่อการเปลี่ยนแปลงก็มันจะ ปิดการนำไฟล์ออกมามากกว่า 1 คน (Lock) ก่อนเสมอ
โดยในบทความนี้เราจะพูดถึง SubVersioN (SVN) ซึ่งเป็น Open Source Application ที่ทำหน้าที่ Revision control ซึ่งได้รับความนิยมสูงมากตัวหนึ่ง โดยถูกสร้างขึ้นมาเพื่อทดแทนการทำงาน Concurrent Versions System (CVS) ที่เก่า, มีความสามารถจำกัด และใช้งานยาก (ผมจะไม่พูดถึง CVS มากนัก เพราะไม่ได้ใช้งานจริง)
ความสามารถคราว ๆ ที่มีมาใน SubVersioN (SVN) มีดังต่อไปนี้
- เป็น Revision Control System แบบ Optimistic Technique
- การ Check in/Commit จะเป็นแบบ Atomicity แบบเดียวกับ Database Management System (DBMS) ทั่ว ๆ ไป
* Atomicity เป็นหนึ่งในกฎ ACID (Atomicity, Consistency, Isolation and Durableness) ของ DBMS ที่รองรับการทำ Concurrency ซึ่งมีคำจำกัดความว่า "กลุ่มคำสั่งงานใดๆ ต้องได้รับการประมวลผลทุกคำสั่งงานทั้งหมดถ้าไม่มีข้อผิดพลาด หรือไม่ได้รับการประมวลผลเลยถ้ามีข้อผิดพลาดเกิดขึ้น" กล่าวคือผู้ใช้งานไม่ต้องกังวลผลของการดำเนินงานที่ไม่สำเร็จ เนื่องจากส่วนจัดการการดำเนินงานจะทำการยกเลิกหรือทำซ้ำให้ผลลัพธ์ถูกต้อง ตัวอย่างเช่น รายการเบิกเงินจากตู้เบิกเงินอัตโนมัติที่ยังทำไม่สำเร็จเนื่องจากระบบเกิดขัดข้อง ส่วนจัดการการดำเนินงานจะยกเลิกรายงานเบิกเงินครั้งนั้น โดยปรับค่ายอดเงินคงเหลือกลับไปค่าเดิม เสมือนหนึ่งไม่มีการทำรายการเบิกเงินครั้งนั้นเลย เป็นต้น - หมายเลขการเปลี่ยนแปลง (Revision number) เป็นแบบส่วนรวม กล่าวคือใช้หมายเลขการเปลี่ยนแปลงร่วมกันทั้งระบบ เพื่อง่ายต่อการจัดการและกันการสับสนของการเปลี่ยนแปลง
- สามารถเปลี่ยนชื่อ, คัดลอก, ตัด และลบไฟล์ โดยมีผลกับหมายเลขการเปลี่ยนแปลงหลักทั้งหมด
- รองรับไฟล์แบบ Binary files
- รองรับ Apache HTTP server บนโปรโตคอล WebDAV/DeltaV โดยสามารถนำมาใช้ผ่านโปรโตคอลแบบ TCP/IP ได้ทำให้ลดปัญหาโดน Firewall ในเครือข่ายไม่ยินยอมให้ผ่านได้อีกด้วย โดยใช้ Apache HTTP server โดยผ่าน port 80 ซึ่งมักจะได้รับการยินยอมให้กระทำผ่าน Firewall ได้อยู่แล้ว
- รองรับการทำ Branching (Branches) และ Tagging (Tags)
- สามารถ Locking ในกรณีที่ต้องการเปลี่ยนแปลงข้อมูลระดับเข้มงวด (เช่นไฟล์ที่มีผลกับระบบมาก ๆ มักทำการ lock ไว้ก่อน เพื่อป้องกันการ merge ไฟล์แล้วมีข้อผิดพลาดใหม่ ๆ หรือข้อมูลนั้นไม่เหมาะให้มีการแก้ไขหลาย ๆ คนในเวลาเดียวกัน)
- รองรับ MIME เต็มรูปแบบ
- เป็น Open Source licensed ในชื่อ "CollabNet/Tigris.org Apache-style license"
ครั้งต่อไปเราจะมาทำการติดตั้ง SVN Server บน Windows ภายใน 10 นาทีกันนะครับ ;)
อ้างอิง
ขอบคุณครับผม อยากอ่านต่อ จังเลยครับ ได้ประโยชน์ มากครับกับการ พัฒนา code ครับ ผม รีบ ๆ มาเข้ขียนต่อนะครับ
เป็นเรื่องเป็นราวเลย T T
เนื่องจากสนใจที่จะศึกษาเรื่อง เทคนิคการพัฒนา SVN กับ CVS เพื่อนำมาเปรียบเทียบกัน อยาทราบว่าพอจะมีเอกสารที่อ้างอิงเกี่ยวกับเทคนิค 2 เรื่องนี้ไหมค่ะ
หรือ แหล่งที่มานะค่ะ
ขอบคุณค่ะ
เคยใช้ SVN แต่เอาโค้ด มา install ที่เครื่อง งมนานมากๆๆ ของ gotoknow อ่ะ
มึนไปพักใหญ่ๆ เลย
ขอบคุณมากครับ พอดีต้องใช้งานและไม่รู้จักมัน อธิบายได้ดีครับ ^ ^