ย้าย svn ไป git

ลูกค้าที่ตลาดหลักทรัพย์ฯ​ เค้าอยากจะย้ายจาก svn ไปใช้ git กัน ด้วยเหตุผลหลาย ๆ อย่าง ในฐานะที่มีหน้าที่เป็น cross-functional scrum master หรือ scrum master ที่ทำมันทุกอย่าง แต่อาจจะไม่ได้ดีสักอย่าง เลยต้องสวมบทบาท devops ออกไปหาข้อมูลการย้าย repository จาก svn ไปเป็น git โดยที่ข้อกำหนดว่า history เดิมใน svn ทั้งหมดจะต้องถูกย้ายมาด้วย

ค้นหาใน google เลย ก็เจอคำตอบจากใน StackOverflow พอจะสรุปวิธีการได้ตามนี้ (อ้างจากใช้ osx คิดว่า linux กับ windows น่าจะไม่ต่างกันมาก)

ก่อนอื่นเราจะเตรียมรายชื่อ user ที่จะใช้อ้างอิงกันระหว่าง svn และ git เราทำใส่ไว้ใน text file เก็บไว้ใน directory ที่ไม่ใช่ directory ที่เราใช้ migrate เช่น ~/authors.txt

svn_username_1=Git User1 "gituser1@somehost.com"
svn_username_2=Git User2 "gituser2@somehost.com"
...

ข้อสังเกตหนึ่งคือ ระหว่างเครื่องหมาย = จะต้องไม่มีช่องว่าง และ svn_username_# คือ username ใน svn ส่วนด้านขวา จะเป็น ชื่อนามสกุล และ email ที่ใช้ใน git

ถัดมาก็เตรียม directory สำหรับ migrate สมมติว่าเราจะใช้ directory ที่ชื่อ project สำหรับ migrate

mkdir project
cd project
git svn init <svn_url> --no-metadata
git config svn.authorsfile ~/authors.txt

svn_url คือ URL ของ svn ที่เราต้องการย้ายไปที่ git และบรรทัดที่ 4 จะเป็นการบอกว่าชื่อ user ที่ใช้ใน svn จะเอามาจากไหน เสร็จแล้ว เสร็จแล้วเราก็ระบุว่าเราอยากจะเอาย้อนหลังไปถึง revision ไหน

git svn fetch -r42

จากตัวอย่างด้านบน หมายถึงให้เอาตั้งแต่ revision ที่ 42 ไล่มาจนถึง revision ล่าสุด แต่ถ้าเราอยากได้ทั้งหมด เราก็ไม่ต้องระบุ option -r ก็ใส่แค่ git svn fetch เฉย ๆ ได้เลย

จากคำสั่งนี้ ถ้า revision มันเยอะ ก็รอหน่อย พอเสร็จแล้วเราสามารถลองเข้าไปดูผลลัพธ์ได้ด้วยคำสั่ง gitk

ถึงตรงนี้สิ่งที่เราได้คือ svn repository ที่ถูก clone มาอยู่ใน local เราเรียบร้อยแล้ว ที่เหลือคือเราจะ push มันเข้าไปที่ remote git repository ของเรา

git remote add origin git@github.com:user/project-name.git

คำสั่งนี้จะเป็นการระบุ remote ที่ชื่อ origin ให้กับ repository นี้ ในตัวอย่างจะเป็น remote repository ที่อยู่บน github

เสร็จแล้วก็ push ได้เลย

git push origin master

เท่านี้ project พร้อมกับ history ก็จะเข้าไปอยู่ใน git เรียบร้อย

Leave a Reply

Your email address will not be published. Required fields are marked *