Friday, April 15, 2011

CVS to Git migration

ဟိုတစ္ေလာက အလုပ္ထဲမွာ source code repository ကို CVS ကေန Git ကိုေျပာင္းမယ္ဆိုျပီး Git server setup လုပ္ထားတာၾကာပါျပီ ။ ထပ္ရတယ့္ project အသစ္ေတြသာ Git မွာသုံးျပီး အေဟာင္းေတြ CVS ကေန မေျပာင္းျဖစ္ေသးဘူး။ Project တာဝန္ခံက ဒီ project migrate ေပးပါလို႕ဆိုမွ က်ေနာ္က ေျပာင္းေပးရတာ။ သူတို႕လည္း ပ်င္းလို႕ထင္တယ္ ။ ဘယ္သူမွ လာမေျပာၾကဘူး။ ဒီေန႕ေတာ့ အရင္ Project အေဟာင္းေလးခု migrate လုပ္ျဖစ္တယ္။ လြယ္လြယ္ကူကူပါပဲ။ Git က CVS ကို ေကာင္းေကာင္းနားလည္းပါတယ္။ သူ႕ဟာသူ ဝင္ checkout လုပ္ျပီး fetch သြားတာပဲ။ က်ေနာ္တို႕ သိဖို႕လိုတာဆိုလို႕ CVS server IP ၊ CVS accessible account တစ္ခု၊ CVSROOT path နဲ႕ migrate လုပ္ခ်င္တယ့္ CVS နာမည္ပဲလိုပါတယ္။

1. ပထမဆုံး လိုအပ္တယ့္ tools ေတြအရင္စစ္ရမယ္။ cvsimport က git-core ထဲမွာ ပါေလ့ရွိပါတယ္။ ဒါေပမယ့္ distro ကျပန္ျပီး package ေတြခြဲထားတာမ်ိဳးဆိုရင္ မပါတတ္ပါဘူး။ Fedora မွာဆို git-core အျပင္ git-cvs ကိုသက္သက္ install ျပန္လုပ္ရပါတယ္။ ကို install ထားတယ့္ git-core ထဲမွာ cvsimport ပါမပါကို git help -a နဲ႕ ၾကည့္လို႕ရပါတယ္။ Support လုပ္တယ့္ git command ေတြထြက္လာပါလိမ့္မယ္။ မ်က္စိေနာက္ရင္ grep နဲ႕ filter လုပ္ၾကည့္ေပါ့။ git help -a | grep cvsimport လို႕ filter လုပ္ၾကည့္ပါ။

2. ေနာက္တစ္ခုက cvsps command line tools ရွိမရွိၾကည့္ပါ။ CVS patchset generate လုပ္တယ့္ tools ပါ။ Patchset ဆိုတာကေတာ့ change history ေတြ၊ revision information ေတြ၊ commit history ေတြကို CVS log ကေန patch set ေျပာင္းေပးပါတယ္။ ( ပက္စက္တယ္ေပါ့ဗ်ာ )။

3. CVS server ကို login လုပ္မယ့္ credential ကို အရင္ prepare လုပ္ထားရေအာင္ ။ ဒီအဆင့္က optional ပါ။ ဒါေပမယ့္ CVS ထဲက repo တစ္ခုမက ခဏခဏ migrate လုပ္ဖို႕လိုရင္ေတာ့ ဒီအဆင့္ေလးကို ေက်ာ္မသြားတာေကာင္းပါတယ္။ Command syntax ကေတာ့

CVSROOT=:cvs-login-method:cvs-user-name@cvs.server.name:/path/to/CVS/root cvs login

ဒီမွာ cvs-login-method ၊ username ၊ servername ၊ CVSROOT path ေတြကို အစားထိုးရပါမယ္။ ဥပမာ cvs-login-method က pserver၊ username က ngar ၊ Servername / IP က 1.2.3.4 ၊ CVSROOT path က /share/cvs ဆိုပါေတာ့၊ ဒါဆို ဒီလိုျဖစ္သြားပါမယ္ ။

CVSROOT=:pserver:ngar@1.2.3.4:/share/cvs cvs login


ဒါဆို password ႐ိုက္ဖို႕ prompt လုပ္လိမ့္မယ္။ Password ႐ိုက္လိုက္ရင္ password ကို hash လုပ္ျပီး ကိုယ့္ $HOME ေအာက္မွာ .cvspass ဆိုတယ့္ file နဲ႕ သြားသိမ္းပါလိမ့္မယ္။

4. ေနာက္ဆုံး အေနနဲ႕ ( အခုမွ စတာပါ တကယ္က ) CVS ကို Git အေနနဲ႕ import လုပ္ပါတယ္။ Command syntax ကေတာ့

git cvsimport -v -d :cvs-login-method:username@servername:/CVSROOT cvs-module-name -C output-directory-name.git

ခုနက အေပၚမွာ ေျပာခဲ့တယ့္ server ေပၚက zephyr ဆိုတယ့္ CVS module ကို import လုပ္ခ်င္တာဆိုရင္ command က ဒီလိုျဖစ္သြားပါမယ္။

git cvsimport -v -d :pserver:ngar@1.2.3.4:/share/cvs zephyr -C zephyr.git

ဒါဆို CVS ကေန checkout လုပ္ျပီး Git repo အျဖစ္နဲ႕ import လုပ္ပါလိမ့္မယ္။ ဇိုက္ဖာရ္ ေဒါ့ ဂစ္ ဆိုျပီး Git repo တစ္ခုရပါလိမ့္မယ္။

အမွန္က ဒါကို Server ကို master အေနနဲ႕ ျပန္ push လုပ္ေပးရပါတယ္။ က်ေနာ္လို ငပ်င္းကေတာ့ တစ္ခါ import လုပ္ တစ္ခါ push လုပ္၊ ႏွစ္ခါ အခ်ိန္ကုန္မခံပါဘူး။ Server ေပၚကေနပဲ import လုပ္ပါတယ္။ ျပီးရင္ repo directory (e.g: zephyr.git) ရဲ့ေအာက္မွာရွိတယ့္ .git ထဲက file ေတြ folder ေတြကို ကူးထုတ္လိုက္ပါတယ္။ .git ( dot git ) ရဲ့ေအာက္မွာ Description တို႕ ၊ head တို႕ ၊ hook တို႕၊ refs တို႕ နဲ႕အတူ branches ေတြရွိပါတယ္။ ဒါေတြ အျပင္ကို ကူးထုတ္လိုက္ရင္ တျခား git client တစ္ခုကေန clone/pull လို႕ရပါျပီ။

Divinity


Nearly Related Post:

1 comment:

Zephyr said...

Good Post.

At last, you did it.
ေနာက္ဆံုးေတာ႔ မင္းလုပ္ခ်လုိက္ျပီ။ ဟမ္။

:)