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

4 comments:

Thep said...

ignore ไฟล์ด้วย .gitignore ก็ได้นี่ครับ?

PPhetra said...

ใน tutorial ที่ผมอ่าน มันแนะนำแต่ exclude ใต้ .git
หัวผมก็เลย block ไม่สนใจความเป็นไปได้อื่นๆเลย

Thep said...

.gitignore มันเป็นมรดกตกทอดมาตั้งแต่ CVS (.cvsignore) น่ะครับ SVN ก็ใช้ .svnignore เหมือนกัน

ว่าแต่ว่า git กับ bzr ที่ คุณป๊อกคิดว่าตัวไหนน่าใช้กว่ากันครับ? หรือว่าเป็นเรื่องศาสนา? :D

PPhetra said...

นี่แหล่ะที่ผมเรียก "block หัว"
เพราะทั้ง .cvsignore และ .svnignore ก็เคยใช้มาทั้งคู่แล้ว
รู้สึกตอนนั้นจะเชื่อไปว่า เนื่องจากเวลาเราดึง repository ไป เราดึงไปทั้งก้อน มันก็ควรจะดึง .git ไปทั้งก้อนด้วย

ส่วน ศาสนา bzr ยังไม่เคยทดลองครับ : )
เคยแต่ลองเข้ารีต hg อยู่นิดหน่อย