Subversion in Actions I

การทำเวอร์ชั่นเป็นอีกเรื่องที่ผมพึ่งศึกษาครับ ตอนนี้ทำทั้ง software และงานเอกสาร มีประโยชน์ดีเหมือนกันใช้ไปก็ชักติดใจ ยังแอบคิดเหมือนกันว่าทำไมไม่รู้จักกันก่อนหน้านี้เนี้ยะ T-T หลักๆ ที่ใช้คือ Subversion (SVN) ครับ เพราะว่าเอาไปใช้เรื่องานเอกสารกับพี่ในห้อง (ซึ่งไม่ได้มาทาง software) เพราะเห็นว่า plugin มันง่ายดีบน Windows แต่ถ้าเป็นงานส่วนตัว ก็ใช้ Git ง่ายทีเดียว ความจริงอยากเขียน Git แต่คิดว่า Git บน Windows ยังไม่เกิดแน่ๆ เลยขอเป็น SVN ก่อนแล้วกัน ส่วน Git ค่อยมาเก็บตกเอาทีหลัง ไหนๆ วันนี้ก็ฤกษ์ดีแล้ว (เห็นเขาว่ากัน แต่ส่วนตัวเฉยๆ มาก) เลยขอเอาคำสั่งที่คิดว่าน่าจะใช้กันบ่อยๆ มาลงดีกว่า

ส่วนประกอบของ Subversion

ส่วนประกอบเบื่องต้นของ SVN

ส่วนประกอบของ SVN

SVN ประกอบด้วย 2 ส่วนก็คือ ทางฝั่งขวาคือฝั่ง Server หรือศัพท์ทางเทคนิคจะเรียกว่า Subversion Server จะเก็บ Repository ที่เราสร้าง ส่วนในภาพขอเรียกสั้นๆ ว่า Repository เพื่อให้เข้าใจได้ง่ายขึ้น Repository จะเป็นคนจัดการเรื่อง Version ของข้อมูล เก็บบันทึกการเปลี่ยนแปลงทุกอย่างไว้ และทำหน้าที่แจกจ่ายข้อมูลให้กับคนที่เข้ามาใช้งาน ฝั่งซ้ายคือ Client หรือศัพท์ทางเทคนิคจะเรียกว่า Subversion Client จะสื่อสารกับ Repository ผ่านตัวกลางที่เรียกว่า Network โดยอาศัยโปรโตคอลต่างๆ นาๆ แล้วแต่ทาง Repository จะสนับสนุน เช่น svn, svn+ssh, https เป็นต้น

สร้าง Repository

ก่อนอื่นที่จะใช้ SVN คือ ต้องมี Repository ที่เราสามารถไป Checkout ข้อมูลมาได้ ในตัวอย่างที่ผมทำคือ สร้างไฟล์ Repository ในเครื่องตัวเองเลย เพื่อไม่ให้ไปเดือดร้อนชาวบ้านด้วย ใช้คำสั่ง

$ svnadmin create /path/to/repository

หมายเหตุ: /path/to/repository จำเป็นอย่างยิ่งที่ต้องเป็น Absolute Path

เสร็จแล้วจะได้โครงสร้างไดเร็คทอรี่ ที่ทำหน้าที่เป็น Repository ดังภาพ

โครงสร้างภายใน Repository เปล่าที่สร้างขึ้นด้วยคำสั่ง svnadmin

โครงสร้างภายใน Repository เปล่าที่สร้างขึ้นด้วยคำสั่ง svnadmin

Check out

จะเห็นได้ว่ายังเป็นไฟล์ หรือไดเร็คทอรี่เปล่าๆ อยู่ มีบ้างก็คือค่าโดยปริยายของ SVN เท่านั้น ซึ่งตอนนี้เราก็ได้ Repository พร้อมใช้งานแล้ว จากนั้นผมย้ายไปที่ Desktop เพื่อที่จะทดลองดึงเอาข้อมูลที่อยู่ใน Repository มาใช้งาน (Checkout) โดยใช้คำสั่ง

  $ pwd
  /Users/sitdh/Desktop/workspace
  $ svn co file:///Users/sitdh/Repository/helloSVNServer
  Checked out revision 0.
  $ ls
  helloSVNServer
  $ cd helloSVNServer/
  $ ls
  • บรรทัดที่ 2 สั่ง Checkout ข้อมูลจาก Repository โดยใช้โปรโตคอล file เพราะว่าทำ Repository ในเครื่องเดียวกัน หาก Repository อยู่ที่อื่นก็ต้องตรวจสอบก่อนกว่าจะใช้โปรโตคอลอะไรสำหรับสื่อสาร หากต้องใส่ชื่อกับรหัสผ่าน ก็ใช้ --username USERNAME และ --password PASSWORD หรือจะใส่ --no-auth-cache เพื่อไมให้เก็บชื่อและรหัสผ่านไว้ก็ได้ครับ จะได้สบายใจ :P ไดเร็คทอรี่นี้จะเรียกว่า Working Copies ครับ
  • บรรทัดที่ 4 เลขตัวสุดท้ายคือ Revision (หรือ version) ใน Repository ที่เป็น 0 เนื่องจาก Repository ของเราสร้างกันสดๆ ร้อนๆ เมื่อครู่นี้เอง ซึ่งตัวเลขนี้จะเพิ่มขึ้นไปเรื่อยๆ เมื่อเราส่งข้อมูลกลับไปยัง Repository (Commit)
  • บรรทัดที่ 8 ลองเข้าไปดูด้านใน Working Copies จะเห็นว่าไม่มีอะไรด้านใน แต่ความจริงแล้วจะมีไฟล์ .svn ซ่อนอยู่ เป็นไฟล์ที่ใช้เก็บข้อมูล index ใน working copies สำคัญมาก ห้ามลบเด็จขาด

เพิ่มและส่งกลับเข้าสู่ Repository (Add + Commit)

เนื่องจากเราไม่ได้เป็นเจ้าของ working copies อย่างแท้จริง และต้องทำงานร่วมกันคนอื่น เลยมีคำแนะนำ (เข้าใจว่าน่าจะเป็น De facto) ให้สร้างไดเร็คทอรี่ขึ้นมาอีก 3 ได้แก่ (เรียงตามการใช้)

  • trunk ใช้เก็บข้อมูลหลักของโปรเจ็คทั้งหมด ภายในนี้จะเก็บข้อมูลที่ถูกตรวจสอบ และยอมรับว่าถูกต้องแล้วจะเรียกว่า baseline
  • branch เก็บข้อมูลส่วนที่แยกออกไปพัฒนาต่างหาก หรือทดลองวิธีการแก้ปัญหาใดอย่างหนึ่ง เพื่อไม่ให้ส่งผลกระทบกับข้อมูลหลักที่อยู่ใน baseline
  • tag ใช้แบ่งข้อมูลออกเป็นหมวดหมู่ใช้งานเหมือนกับ tag ใน Web 2.0

วิธีสร้างง่ายมากครับ คือ สร้างไดเร็คทอรี่ที่ต้องการแล้วค่อยใช้คำสั่ง add ของ svn ทีหลัง หรือใช้คำสั่ง mkdir ของ svn เพื่อสร้างและใส่เข้าไปใน list สำหรับ Commit ไปยัง Repository เลยก็ได้

วิธีที่ 1

$ mkdir trunk; mkdir branch; mkdir tag

$ ls
branch   tag   trunk

$ svn add *
A          branch
A          tag
A          trunk

วิธิที่ 2

$ svn mkdir trunk; svn mkdir branch; svn mkdir tag
A          trunk
A          branch
A          tag

$ ls
branch   tag   trunk

หลังจากนั้นสั่ง commit เพื่อส่งข้อมูลไปให้ Repository ด้วยคำสั่ง

$ svn ci -m "Initialize Repository Structure"
Adding          branch
Adding          tag
Adding          trunk

Committed revision 1.

คำสั่งด้านบนจะส่งข้อมูล หรือ Commit ไปยัง Repository ที่ Checkout มาข้างต้น โดยจะมีข้อความบันทึกประจำรุ่นตามข้อความที่ระบุหลัง -m หรือใช้ --message ก็ได้เช่นกัน บรรทัดที่ 2-4 คือ รายการไฟล์ที่ส่งข้อมูลเข้าไปยัง Repository ส่วนบรรทัดสุดท้ายคือเวอร์ชั่นล่าสุดหลังจากส่งไฟล์เข้าสู่ Repository

ตอนนี้เราได้โครงสร้างสำหรับเก็บข้อมูลเรียบร้อยแล้ว (อย่าลืมนะครับ นี่คือโครงสร้างแนะนำเท่านั้น ไม่จะเป็นต้องสร้างโครงสร้างแบบนี้ก็ใช้ได้ปกติ) ต่อไปคือเริ่มทดลองสร้างโปรเจ็คกันครับ เริ่มด้วยเข้าไปยัง trunk แล้วสร้างไดเร็คทอรี่ และไฟล์ด้านใน [02-04] เสร็จแล้วจะใส่ไฟล์เข้าไปในรายการอัพเดตกับ Repository [07-09] แล้วจึงส่งไฟล์ไปยัง Repository [11-15] ดังนี้

  $ cd trunk
  $ mkdir aloha
  $ cd aloha
  $ touch index.php
  $ cd ..

  $ svn add *
  A          aloha
  A          aloha/index.php

  $ svn ci -m "Create Project"
  Adding          trunk/aloha
  Adding          trunk/aloha/index.php
  Transmitting file data .
  Committed revision 2.

ซึ่งหากมีไฟล์ใหม่เพิ่มขึ้นมาเรื่อยๆ ก็สามารถใช้คำสั่ง snv add ตามด้วย svn ci เพื่อส่งข้อมูลภายใน working copies ไปสู่ repository

จากตัวอย่างด้านบนเป็นการอธิบายการใช้งานเบื้องต้น ยังเหลือการทำงานต่างๆ ที่ช่วยอำนวยความสะดวกให้กับผู้ใช้มากขึ้น ก็ขอยกไปตอนหน้าแล้วกันนะครับ

Tags: , ,

View Comments to “Subversion in Actions I”

  1. We Project Says:

    Subversion in Actions II…

    คราวที่แล้วเขียนเกี่ยวกับการใช้ Subversion (svn) เบื่องต้น ได้แก่ การสร้าง Repository, เพิ่มไฟล์เข้าสู่ index ใน working copies (add), และส่งเข้าสู่ Repository (commit) ส่วนตอนนี้ก็จะขอพูดส่วนเกี่ยวกับคำสั่งต่างๆ ที่เอาไว้ติดตามความเคลื่อนไหว และการเปล…

Leave a Reply

blog comments powered by Disqus