418342 ภาคปลาย 2552/ปฏิบัติการที่ 1
เนื้อหา
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