418342 ภาคปลาย 2552/ปฏิบัติการที่ 1

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

Mercurial

ในเทอมนี้เราจะใช้ Mercurial ซึ่งเป็นซอฟต์แวร์สำหรับจัดการซอร์สโค้ดตัวหนึ่ง ในการให้การบ้าน การส่งการบ้าน รวมไปถึงการทำแล็บ

คุณสามารถดาวน์โหลด Mercurial ได้จาก [1] และถ้าคุณใช้ระบบปฏิบัติการ Windows เราแนะนำให้คุณลง TortoiseHg ด้วย เพราะมันช่วยทำให้คุณใช้ Mercurial ได้สะดวกขึ้นมาก

เราได้สร้าง repository (ที่เก็บไฟล์)​ ส่วนตัวให้กับนิสิตทุกคนที่ลงทะเบียนแล้ว ซึ่งมันอยู่ที่ https://theory.cpe.ku.ac.th/418342_<<ชื่อ account เกษตร ของคุณ>> ส่วนรหัสผ่านเราจะแจกให้คุณในชั้นเรียน

เมื่อคุณเข้าไปแล้วจะพบว่าในนั้นไม่มีไฟล์อะไรอยู่เลย

การทำงานกับระบบจัดการซอร์สโค้ด

การทำงานโดยใช้ระบบจัดการซอร์สโค้ดมีขั้นตอนดังต่อไปนี้

คุณทำการ clone repository ที่เก็บอยู่บนเครื่องเซิร์ฟเวอร์ (ในที่นี้คือเครื่อง theory.cpe.ku.ac.th) ลงเครื่องส่วนตัวของคุณ
while true do
   pull ความเปลี่ยนแปลงที่อยู่บน server มา
   update ซอร์สโค้ดที่เก็บไว้บนเครื่อง
   แก้ไขซอร์สโค้ดบนเครื่องส่วนตัว
   commit ความเปลี่ยนแปลงที่คุณสร้าง
   push ความเปลี่ยนแปลงที่อยู่บนเครื่องส่วนตัวเข้าเครื่องเซิร์ฟเวอร์

คุณจะเห็นได้ว่ามีขั้นตอนที่มีชื่อเป็นภาษาอังกฤษสามขั้นตอนคือ clone, pull, update, commit, และ push ขั้นตอนสามขั้นตอนนี้เป็นคำสั่งของ mercurial ที่คุณสามารถใช้ได้โดยตรง และเราจะมาเรียนรู้มันกันในวันนี้

การ clone

การ clone คือการคัดลอก repository ทั้ง repository มาเก็บไว้บนเครื่องของคุณ สิ่งที่คุณได้มากับ repository คือประวัติศาสตร์ความเปลี่ยนแปลงทั้งหมดที่คุณเคยสร้างกับโค้ดที่อยู่ใน repository นั้น ฉะนั้นเมื่อคุณมี repository แล้วคุณสามารถจะย้อนไปดูโค้ดเวอร์ชันไหนก็ได้ตั้งแต่เริ่มต้นทำงาน คล้ายกับที่คุณสามารถดู history ของหน้าวิกินี้ได้

การโคลนเราจะใช้การสั่ง hg clone โดยให้คุณเข้าไปใน command prompt ของระบบปฏิบัติการคุณ แล้วสั่ง

hg clone https://theory.cpe.ku.ac.th/418342_<<ชื่อ account>> <<ชื่อไดเรคทอรีที่คุณต้องการให้เป็นที่อยู่ของ repository>>

เช่น ถ้าผมต้องการให้ repository ของผมอยู่ที่ไดเรคทอรี c:\418342 ผมอาจจะสั่งคำสั่งต่อไปนี้

cd c:\
hg clone https://theory.cpe.ku.ac.th/418342_pramook 418342

สำหรับคนที่ใช้ TortoiseHg คุณสามารถคลิกขวาในหน้าต่าง Explorer ของไดเรคทอรีที่คุณต้องการ "Clone a Repository Here..."

คำถาม 1

ในไดเรคทอรีที่คุณเพิ่งจะโคลนมามีไฟล์อะไรบ้าง? (รวมไฟล์ที่ถูกซ่อน (hidden) ด้วย)

การ pull

เวลาโปรแกรมเมอร์หลายคนทำงานพร้อมๆ กัน จะมีการตั้ง server กลางไว้หนึ่งเครื่องเพื่อเก็บโค้ดที่เสถียรและได้รับการทดสอบมาอย่างดีแล้ว หลังจากนั้นโปรแกรมเมอร์แต่ละคนก็จะ clone repository มาไว้บนเครื่องของตัวเอง แล้วทำงานไปเรื่อยๆ บางคนทำงานเสร็จแล้วก็จะส่งโค้ดที่ตนเองแก้ไขหรือเพิ่มเข้า repository ไป เมื่อโปรแกรมเมอร์คนอื่นต้องการจะได้ความเปลี่ยนแปลงที่โปรแกรมคนอื่นสร้างและส่งเข้าสู่ server แล้ว เขาจะทำการ "pull" มันออกมาจาก server

สำหรับการเรียนการสอนวิชานี้ การตั้ง server ของเราจะไม่เหมือนกับที่กล่าวในย่อหน้าที่แล้ว ผมได้ตั้ง "master repository" ที่จะบรรจุโค้ดแล็ปและการบ้านไว้ ถ้าคุณต้องการโค้ดของแล็ปหรือการบ้าน คุณจะต้องไป pull มันจาก master repository มายัง repository บนเครื่องคอมพิวเตอร์ส่วนตัวของคุณ

​master repository ของเราอยู่ที่ https://theory.cpe.ku.ac.th/418342_master/ เมื่อคุณเข้าเวบไซต์ที่ URL นี้คุณสามารถเข้าไปดูว่าใน repository นี้ไฟล์อะไรอยู่บ้างด้วยการคลิกที่ลิงค๋ "manifest"

คำถาม 2

ใน master repository มีไฟล์อยู่กี่ไฟล์? อะไรบ้าง?

เมื่อคุณพร้อมที่จะดึงไฟล์จาก master repository เข้า repository บนเครื่องส่วนตัวของคุณแล้ว

ในการณ์นี้ให้คุณเข้าไปในไดเรคทอรีที่ของ repository แล้วสั่ง

hg pull https://theory.cpe.ku.ac.th/418342_master

การ Update

เมื่อคุณเข้าไปดูในไดเรคทอรีของ repository บนเครื่องคอมพิวเตอร์ส่วนตัวของคุณ คุณจะพบว่ายังไม่มีความเปลี่ยนแปลงอะไรเกิดขึ้นเลย

นี่เป็นเพราะว่าสิ่งที่ Mercurial ทำเวลาคุณสั่ง pull คือการไปดึงเอา "เซตของความเปลี่ยนแปลง" (changeset) ที่ server มายังเครื่องของคุณ แต่มันยังไม่ได้ทำให้เซตของความเปลี่ยนแปลงนี้มีผลกับเนื้อหาของไฟล์ที่คุณกำลังแก้ไข

หากคุณต้องการทำให้ changeset ที่ดึงมามีผลต่อไฟล์ที่คุณกำลังแก้ไข ให้สั่ง

hg update

แก้ไขไฟล์

ให้ทดลองเปลี่ยนแปลงไฟล์ lab-01/hello.rb และสร้างไฟล์ lab-01/hello2.rb แล้วก็อปปี้เนื้อหาของ lab-01/hello.rb ไปใส่

คำถาม 3

คุณสามารถดูสถานะของไฟล์ต่างๆ ในไดเรคทอรีได้ด้วยการสั่ง

hg status

หลังจากลองสั่งคำสั่งนี้แล้วคุณเห็นอะไรบ้าง?


หลังจากคุณแก้ไขและสร้างไฟล์ใหม่นี้เสร็จแล้ว Mercurial ยังไม่รู้ว่ามีไฟล์ lab-01/hello2.rb นี้อยู่เลย ถ้าคุณอยากจะให้ Mercurial จัดการไฟล์นี้ให้ด้วย ให้สั่ง

hg add lab-01/hello2.rb

เพื่อบอกให้ Mercurial เพิ่มไฟล์ lab-01/hello2.rb เข้าในบัญชีของไฟล์ที่มันจัดการให้ ในกรณีที่คุณสร้างไฟล์ใหม่จำนวนหลายๆ ไฟล์ คุณสามารถสั่ง

hg add

เฉยๆ แล้ว Mercurial จะเพิ่มไฟล์ใหม่ทุกไฟล์ที่ยังไม่อยู่ในบัญชีให้โดยอัตโนมัติ

คำถาม 4

สั่ง hg status อีกครั้ง หลังจากลองสั่งคำสั่งนี้แล้วคุณเห็นอะไรบ้าง?

การ commit

แต่หลังจาก add ไฟล์ใหม่ไปแล้ว Mercurial ก็ยังไม่รู้ว่าเนื้อหาของไฟล์มีการเปลี่ยนแปลงแต่อย่างใด มันรู้เฉยๆ ว่ามีไฟล์ใหม่เท่านั้น หากเราต้องการให้ Mercurial รับทราบถึงการเปลี่ยนแปลงของเนื้อหาของไฟล์ต่างๆ เราต้องสั่ง

hg commit

เมื่อสั่งเช่นนี้แล้วคุณจะพบว่ามีหน้าต่าง text editor โผล่ขึ้นมาพร้อมกับข้อความทำนองนี้

HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: pramook
HG: branch 'default'
HG: added lab-01/hello2.rb
HG: changed lab-01/hello.rb