แต่ก็ยังต้องการ sync กับ Ofbiz อย่างไกล้ชิด (ไม่เหมือน Opentap ที่แยกออกไปอย่างชัดเจน)
ทำให้เราต้องคอย merge code จาก Ofbiz เข้ามายัง Orangegears เป็นระยะๆ
วิธีการเดิมที่น้อง sand ใช้ ก็คือใช้ kdiff3 ทำการ merge
ซึ่งก็สะดวกดี เพราะมี UI สวยงาม
แต่ผมก็เจอปัญหาว่า changed ของผมมักจะหายไปบ่อยๆ
ผมก็เลยมองหาวิธีใหม่ๆมาเรื่อยๆ
วันก่อนหลังจากลองเล่น multiple branches ใน git ดู
ก็พบว่า git ยืดหยุ่นพอที่เราจะทำ multiple remote branch จาก svn repository มากกว่า 1 ที่ได้
ผมก็เลยทดลอง merge ด้วยวิธีนี้ดู
วิธีการก็คือ
เริ่มด้วยการสร้าง git repository ที่มี link ชี้ไปยัง project ofbiz ก่อน
git svn init http://svn.apache.org/repos/asf/ofbiz/trunk
หลังจากสั่งคำสั่งนี้ git จะสร้าง working directory เปล่าๆให้ (ยังไม่ fetch code มาให้)
โดย file .git/config จะมีหน้าตาแบบนี้
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "svn"]
url = http://svn.apache.org/repos/asf/ofbiz/trunk
fetch = :refs/remotes/trunk
เราก็ทำการจัดแจงแก้ไขชื่อให้เหมาะสม จะได้ไม่งงภายหลัง
และทำการเพิ่ม repository ของ Ofbiz เข้าไป
[svn-remote "ofbiz"]
url = http://svn.apache.org/repos/asf/ofbiz/trunk
fetch = :refs/remotes/ofbiz_trunk
[svn-remote "orangegears"]
url = https://orangegears.svn.sourceforge.net/svnroot/orangegears
fetch = trunk:refs/remotes/og_trunk
จากนั้นก็ทำการ fetch ข้อมูลทีละ repository
เริ่มจาก ofbiz ก่อน เอา revision ล่าสุดเลย ไม่เอา history
Note1: เลข revision ของ ofbiz นี่ล่อไปหลักหกแสนแล้ว
ทั้งนี้เพราะ repo ของ apache เขาใช้ share ร่วมกันทุก project
Note2: ผมลอง fetch orangegears ก่อน ปรากฎว่า fetch ofbiz ไม่ได้ (ไม่มี error ด้วย)
git svn fetch -r 666189:HEAD ofbiz
ตามด้วย orangegears โดยเริ่มต้นที่ revision 142 เลย ไม่ต้องย้อนอดีตมากนัก
git svn fetch -r 142:HEAD orangegears
ลองสั่ง git branch -r จะเห็นว่ามี og_trunk กับ ofbiz_trunk เกิดขึ้น
pphetra@mypann:~/projects/java/t$ git branch -r
ofbiz_trunk
og_trunk
โดย default trunk ของ ofbiz จะถูก map เข้ามาเป็น master ใน local branch
ทำการเปลี่ยนชื่อให้เรียบร้อย จะได้ไม่งงว่าใครเป็นใคร
git branch -m master ofbiz
ส่วน og_trunk นั้นยังไม่มี local branch ต้องทำการสั่ง
git checkout -b og og_trunk
ขั้นตอนการ merge
fetch code จาก ofbiz ให้ up-to-date ก่อน
git checkout -f ofbiz
git svn rebase
fetch code ของ orangegears ให้ up-to-date เช่นเดียวกัน
git checkout -f og
git svn rebase
เตรียม branch สำหรับ merge โดยสร้าง branch แยกออกจาก og (ไม่จำเป็น แต่ก็ควรทำเป็นนิสัย)
git checkout -b merge-ofbiz
สั่ง merge
git merge ofbiz
ที่ยากก็คือเวลาเกิด conflict ก็ต้องตามแก้ไขให้เรียบร้อยก่อน
Note1: สำหรับผม ผมเลือกใช้ emacs + git-emacs mode ซึ่งมันจะเรียกใช้ ediff ในการ solve conflict
Note2: คิดว่าการ merge ครั้งแรก จะมี conflict เยอะหน่อย
แต่พอเป็นการ merge ครั้งที่ 2.. จะมี conflict น้อยลง เพราะว่า branch ทั้งสองมี history ที่เชื่อมกันแล้ว
(เป็นผลดีต่อ three-way merge)
switch กลับไปยัง og และทำการ merge
git checkout -f og
git merge merge-ofbiz
จากนั้นก็สั่ง commit กลับขึ้น svn repository
git svn dcommit
สุดท้ายก็ลบ temporary branch ทิ้ง
git branch -D merge-ofbiz
ไว้จะทดลองทำสักระยะหนึ่ง (โดยยังไม่ commit ผลลัพท์จากการ merge กลับขึ้น orangegears)
เพื่อดูว่ามันมีประสิทธิภาพแค่ไหนก่อน
7 comments:
ผมใช้ bzr เพื่อ maintain branch แล้วก็ merge จาก svn ในลักษณะคล้าย ๆ กันครับ
ลำบากหน่อยตรงที่ bzr ต่อกับ svn ได้ไม่ราบรื่นเหมือน git
ผมกำลังหาเอกสารการใช้ git อยู่ครับพี่พี่ป๊อกมีหแห่งข้อมุลมั้ยครับ เมื่อวันศุกร์ที่ผ่านมาเจอ OFBiz update มโหฬารเลยนั่ง patch ตั้งแต่ 15.00 20.00 บางไฟล์ต้อง manual merge กว่า 500 จุดถ้า git มาช่วยผมตรงนี้ได้นี่เยี่ยมเลยครับพี่
เริ่มอ่านอันนี้ก่อนนะ
http://git.or.cz/course/svn.html
ได้แล้ว ก็ค่อยๆหาอ่านเพิ่มขึ้น แล้วก็ทดลองทำบ่อยๆ
sand ลงมากรุงเทพฯเมื่อไรหล่ะ
พี่จะเปิด course train git ให้โดยเฉพาะเลย (เอาเจ้า roofimon มานั่งเรียนด้วย)
ส่วนตัว จากที่ลองใช้มา พี่คิดว่า ถ้าเราจะ fork ofbiz ในลักษณะนี้
การใช้ git น่าจะเป็นอะไรที่ลงตัวมาก
ข้อดีของมันก็คือ มันเหมาะแก่การทำ branch มากๆ
ในอนาคตสมมติว่า sand ต้อง maintain ลูกค้าหลายๆราย
การ maintain version ของแต่ละรายนี่คงไม่สนุกแน่ๆ
แต่ถ้าเราใช้ git ด้วย feature branch, selective patch, reorganize patch
จะทำให้เราจัดการกับปัญหา update patch, upgrade version ได้ง่ายขึ้น
วันนี้พึ่งลอง patch จาก ofbiz เข้ามาอีกครั้ง (revision 666746 ถึง 667116)
พบว่าราบรื่นดี ไม่มี conflict ที่ไม่จำเป็นโผล่มาแล้ว
อ้อ เวลาเกิด conflict, git มันสามารถ delegate ให้ kdiff3 เป็นคน resolve ให้ได้ด้วยนะ ไม่จำเป็นต้องมานั่งหัดใช้ emacs แบบพี่
ขอบคุณครับพี่ เดี่ยวขอเคลียร์งานงานเดือนนี้จะลงไปแน่นอนครับ จะไปปรึกษาเรื่อง Road Map ของ OrangeGears ด้วยครับตอนนี้เริ่มงงแล้วว่าจะเอาอะไรก่อนดี เงินก็ต้องหาเลี้ยงชีพแต่ ปีหน้าคงมีเวลามากขึ้นเพราะว่าผมกำลังทำโปรเจ็กหนึ่งเป็นของผมเองใช้ OFBiz + Google Map + Jabber + GWT ว่าจะเอาเจ้านี้หาเงินระยะยาวจะได้ไม่ต้องมานั่งหาลูกค้าและจะได้มีเวลามาทำ OrangeGears และตอนนี้มีน้องๆฝึกงานจาก ม.ราชมงคลล้านนามาฝึกงานด้วย
ลองทั้งคืนเลยครับ กว่าจะเข้าใจ concept ของ container/branches เล่นเอางงไปหลายรอบ
ตอนนี้ fork groovy ด้วย git แล้วครับ
github ให้เนื้อที่จำกัด 100 M แล้วไปเจอว่ามีหลาย project ใช้ repo.or.cz ที่ดูเหมือนจะไม่จำกัดเนื้อที่ครับ
ปล. git เร็วมากครับ
cblue: เยี่ยมเลยครับ, ตอนผมใช้ตอนแรงก็งงอยู่นานเลยครับ คิดว่าจะง่ายเหมือนใช้ svn
เรียนด้วยคน
Post a Comment