Thursday, November 15, 2007

ย้อนทบทวน git

ในงาน codefest เมื่อสองอาทิตย์ก่อน ผมทดลองนำ git มาใช้
ซึ่งผลของเวลาที่จำกัด + การที่ไม่เคยใช้มันมาก่อน ก็ทำให้มีประสบการณ์ที่ไม่ค่อยดีกับมันนัก

เริ่มแรกสุดลองดู graph ของการ merge ที่เกิดขึ้นก่อน



ดูก็สวยดีนะ แต่จริงๆแล้วมันมั่วมาก
เนื่องจากมี คน develop อยู่ 4 คน
ประเด็นแรกก็คือ มันควรจะตั้งให้คนใดคนหนึ่งเป็น ศูนย์รวม
แล้วก็ให้แต่ละคนที่เหลือ push กับ pull ผ่านทางจุดที่เป็นศูนย์รวมนั้น
แต่ปรากฎว่าเวลา เรา start git-daemon
default mode ของมันก็คือ pull ไปได้อย่างเดียว ไม่รับ
การ push กลับ
เนื่องจากช่วงนั้นผม concentrate กับ erlang อย่างเดียว
เลยไม่มีสมาธิมาลองหาดูว่า ต้องใส่ flag อะไร เพื่อให้มันสามารถรับการ push ได้
ตอนนั้นเลยแก้ปัญหาด้วยการใช้ pull อย่างเดียว
ใครทำอะไรเสร็จ ก็ให้ start server จากนั้นก็ให้ทีเหลือ pull ออกมาจากคนนั้น
มารู้ทีหลังว่า ถ้าต้องการ start daemon ให้รับ push ได้ด้วยนั้น
ต้องไส่ flag ให้มัน enable service "receive-pack" ด้วย

git-daemon --reuseaddr --export-all --base-path=. --enable=receive-pack .


ประเด็นถัดไป ก็คือ
ปกติในการเก็บ version control เราจะ ignore file พวกที่เป็นผลลัพท์จากการ compile
ใน git เราสามารถระบุ file ที่ ignore ได้ใน file .git/info/exclude
แต่ปัญหาก็คือ ตอนที่มีคน clone code ออกจาก repository เรา
เจ้า file exclude มันไม่ได้ไปด้วย
ผลก็คือ น้องๆที่เอาไปพัฒนาต่อ commit file พวกนี้เข้าใน repository กันทุกคน
พอถึงเวลา pull กลับมา มันก็จะเกิด error ฟ้องว่า merge ไม่ได้
วันนี้มานั่งอ่านคู่มือไล่หาว่าเราควรกำหนด exclude file อย่างไรดี
กลายเป็นว่า เวลาเรา clone repository
file ที่อยู่ใต้ .git มันจะเอามาจาก /usr/share/git-core/templates

Related link from Roti