การใช้งาน subversion เบื้องต้น

หลังจากที่ สร้าง svn repository ในบทความนี้จะแนะนำการใช้งาน svn เบื้องต้น โดยจะประกอบด้วยคำสั่ง import, checkout, commit

อนุญาตให้ users สามารถเขียนไฟล์ใน repository ได้

ก่อนที่ users สามารถที่จะใส่ไฟล์เข้าไปใน repository ที่ root เป็นคนสร้างไว้ ต้องเปลี่ยน permission ของไดเร็คทอรีที่สร้างขึ้นก่อน ในที่นี้คือ /var/svn/test_svn/

[root@svn ~]# cd /var/svn/
[root@svn svn]# chmod -R g+w test_svn/
[root@svn svn]# chgrp -R users test_svn/
[root@svn svn]# ls -l
total 4
drwxrwxr-x 7 root users 4096 2008-11-27 23:37 test_svn

svn import – เริ่มต้นใส่ข้อมูล

ทดสอบโดยใช้ user01 เขียนโปรแกรมขึ้นมาเก็บไว้ในไดเร็คทอรี my-scripts/ และในนี้มีไฟล์ที่สร้างขึ้นสองไฟล์ คือ index.php  และ README

[user01@svn ~]$ ls -lR my-scripts/
my-scripts/:
total 8
-rw-r--r-- 1 user01 users 25 2008-11-27 23:51 index.php
-rw-r--r-- 1 user01 users  7 2008-11-27 23:51 README

ตัวอย่างไฟล์ที่สร้างขึ้น

[user01@svn ~]$ cat my-scripts/index.php
<?php
echo "hello";
?>

ใช้คำสั่ง svn import เพื่อใส่ไฟล์ที่สร้างขึ้นเข้าไปใน repository ได้ ดังตัวอย่าง

[user01@svn ~]$ svn import my-scripts file:///var/svn/test_svn/my-scripts -m "Initial import"
Adding         my-scripts/index.php
Adding         my-scripts/README
Committed revision 1.

คำอธิบาย

  • my-scripts ส่วนแรกเป็นการระบุไดเร็คทอรี ที่เราเพิ่งสร้างไฟล์ขึ้น
  • my-scripts อันหลังจะเป็นการระบุชื่อที่เก็บไว้ใน repository
  • ออปชั่น -m เป็นคำอธิบายในการเปลี่ยนแปลงข้อมูลใน repository เพื่อการอ้างอิงย้อนหลังได้
  • file:///var/svn/test_svn ระบุที่อยู่ของ repository โดยเริ่มต้นเราจะทดสอบบน local disk ข้อสังเกต มีเครื่องหมาย / สามอัน

หลังจากที่ import ไฟล์เข้าไปแล้ว แนะนำให้เก็บสำรอง ไฟล์ดั้งเดิมเอาไว้ก่อน ในตัวอย่างนี้จะเปลี่ยนชื่อเป็น .bak

[user01@svn ~]$ mv my-scripts my-scripts.bak
[user01@svn ~]$ ls -l
total 4
drwxr-xr-x 2 user01 users 4096 2008-11-27 23:51 my-scripts.bak

svn checkout – ดึงไฟล์ออกมาจาก repository

ใช้คำสั่ง svn checkout เพื่อดึงไฟล์ที่ต้องการออกมา โดยต้องระบุ path ให้ถูกต้อง ตามที่ระบุไว้ตอนที่ import เข้าไป

[user01@svn ~]$ svn checkout file:///var/svn/test_svn/my-scripts
A    my-scripts/README
A    my-scripts/index.php
Checked out revision 1.
[user01@svn ~]$ ls -l
total 8
drwxr-xr-x 3 user01 users 4096 2008-11-28 00:03 my-scripts
drwxr-xr-x 2 user01 users 4096 2008-11-27 23:51 my-scripts.bak

เราจะได้ไดเร็คทอรี่ และไฟล์ที่เราเพิ่งใส่เข้าไปกลับคืนมา ในที่นี้คือ my-scripts

ลองตรวจสอบไฟล์ที่อยู่ในนี้ จะเห็นว่ามี ไดเร็คทอรี่ พิเศษเพิ่มเติมขึ้นมา ชื่อว่า .svn/ โดยจะเป็นส่วนที่เก็บคอนฟิกและการตรวจสอบการเปลี่ยนแปลงไฟล์ของ subversion ห้ามลบทิ้ง

[user01@svn ~]$ cd my-scripts
[user01@svn my-scripts]$ ls -la
total 20
drwxr-xr-x 3 user01 users 4096 2008-11-28 00:03 .
drwx------ 6 user01 users 4096 2008-11-28 00:03 ..
-rw-r--r-- 1 user01 users   25 2008-11-28 00:03 index.php
-rw-r--r-- 1 user01 users    7 2008-11-28 00:03 README
drwxr-xr-x 6 user01 users 4096 2008-11-28 00:03 .svn
[user01@svn my-scripts]$ ls -l .svn/
total 24
-r--r--r-- 1 user01 users  438 2008-11-28 00:03 entries
-r--r--r-- 1 user01 users    2 2008-11-28 00:03 format
drwxr-xr-x 2 user01 users 4096 2008-11-28 00:03 prop-base
drwxr-xr-x 2 user01 users 4096 2008-11-28 00:03 props
drwxr-xr-x 2 user01 users 4096 2008-11-28 00:03 text-base
drwxr-xr-x 5 user01 users 4096 2008-11-28 00:03 tmp

svn info – ตรวจสอบเวอร์ชั่นของไฟล์

ใช้คำสั่ง svn info เพื่อตรวจสอบเวอร์ชั่น (Revision) และข้อมูลการเปลี่ยนแปลงล่าสุดของไฟล์ได้

[user01@svn my-scripts]$ svn info
Path: .
URL: file:///var/svn/test_svn/my-scripts
Repository Root: file:///var/svn/test_svn
Repository UUID: 1b23135d-c21e-4acd-826f-e74e671c30c9
Revision: 1
Node Kind: directory
Schedule: normal
Last Changed Author: user01
Last Changed Rev: 1
Last Changed Date: 2008-11-27 23:56:16 +0700 (Thu, 27 Nov 2008)

svn status – ตรวจสอบสถานะการแก้ไขไฟล์

ทดลองแก้ไขไฟล์ index.php ในที่นี้จะแก้เป็น

[user01@svn my-scripts]$ cat index.php
<?php
echo "hello";
echo "world";
echo "test subversion";
?>

ใช้คำสั่ง svn status เพื่อตรวจสอบการแก้ไข

[user01@svn my-scripts]$ svn status
M      index.php

ผลลัพธ์ที่ได้จากคำสั่ง svn status จะแสดงรายชื่อไฟล์ที่มีการเปลี่ยนแปลง พร้อมทั้งตัวอักษรย่อ เช่น

  • M  ไฟล์มีการแก้ไข
  • A  ไฟล์ถูกสร้างขึ้นมาใหม่
  • D  ไฟล์ถูกลบไป
  • ?   ยังไม่มีข้อมูลของไฟล์

svn commit – ปรับปรุงการแก้ไขไฟล์เข้าไปใน repository

หลังจากที่แก้ไขไฟล์ต่างๆ เสร็จเรียบร้อย ใช้คำสั่ง svn commit เพื่อใส่ข้อมูลการเปลี่ยนแปลง กลับเข้าไปใน repository อีกครั้ง ระบุออปชั่น ‘-m’ เพื่อใส่คำอธิบายการแก้ไข

[user01@svn my-scripts]$ svn commit -m "added more lines"
Sending        index.php
Transmitting file data .
Committed revision 2.

svn add – เพิ่มไฟล์ใหม่

หากต้องการสร้างไฟล์ใหม่ขึ้นมา ก็สามารถสร้างได้ตามปกติ แล้วใช้คำสั่ง svn add เพื่อเพิ่มไฟล์ใหม่นี้เข้าไปใน repository

[user01@svn my-scripts]$ ls -l
total 12
-rw-r--r-- 1 user01 users 63 2008-11-28 00:10 index.php
-rw-r--r-- 1 user01 users 40 2008-11-28 00:16 new-file1.php
-rw-r--r-- 1 user01 users  7 2008-11-28 00:03 README
[user01@svn my-scripts]$ svn status
?      new-file1.php
[user01@svn my-scripts]$ svn add new-file1.php
A         new-file1.php
[user01@svn my-scripts]$ svn commit -m "added a new file 1"
Adding         new-file1.php
Transmitting file data .
Committed revision 3.

svn delete – ลบไฟล์ออก

หากต้องการลบไฟล์ สามารถทำได้โดยใช้คำสั่ง svn delete ไฟล์จะถูกลบออกทั้งจาก ไดเร็คทอรี และจาก repository

[user01@svn my-scripts]$ svn delete new-file1.php
D         new-file1.php
[user01@svn my-scripts]$ svn commit -m "deleted a new file 1"
Deleting       new-file1.php
Committed revision 4.
[user01@svn my-scripts]$ ls -l
total 8
-rw-r--r-- 1 user01 users 63 2008-11-28 00:10 index.php
-rw-r--r-- 1 user01 users  7 2008-11-28 00:03 README

คำแนะนำการ commit

จะเห็นว่ากการ commit แต่ละครั้ง ตัวเลข Revision จะเพิ่มทีละหนึ่ง ซึ่งอาจเกินความจำเป็นและจะยากต่อการอ้างอิงเพื่อดึงข้อมูลย้อนหลัง (revert) คำแนะนำคือ ให้ commit หลังจากที่ปรับปรุงโปรแกรมไปพอสมควร เช่นแก้ไขปัญหาที่เกิดขึ้นจบไป หรืออาจจะวันละครั้ง  ใส่คำอธิบายหรือเหตุผลของการเปลี่ยนแปลง และให้แน่ใจว่าสิ่งที่แก้ไขไปนั้นโปรแกรมสามารถรันได้โดยไม่มีข้อผิดพลาด แล้วค่อย commit กลับเข้าไปใน repository เผื่อว่าเวลามาดึงข้อมูลย้อนหลังจะได้นำมาใช้งานได้เลย

ข้อมูลอ้างอิง

Leave a Reply