How to manage Git Repository Server with Gitosis?

ပရောဂျက်တစ်ခုချင်းအလိုက် Permission မလိုအပ်ရင်နဲ့ လူနည်းရင်တော့ Authorized Key နဲ့အဆင်ပြေပါတယ်။ ဒါပေမယ့် Permission တွေလိုအပ်လာပြီ နောက်ပြီးတော့ Repository Initialization တွေ User Management တွေလိုလာရင်တော့ Authorized Key နဲ့မလုံလောက်တော့ပါဘူး။ အသုံးများတာကတော့ Gitosis နဲ့ Gitolite သုံးကြပါတယ် ကောင်းတာကတော့ နှစ်ခုလုံးကောင်းပါတယ် တစ်ခုတော့ရှိပါတယ် Gitosis ကတော့ Development ရပ်နေတာ အတော်လေးကြာနေပါပြီ။

Gitosis ကို Setup လုပ်ရတာ သိပ်မခက်ပါဘူး အရင်ဆုံးတော့ Gitosis ကိုသူ့ရဲ့ Repository ကနေ Clone လုပ်ယူရပါတယ်။ အကယ်လို့ Ubuntu လိုသုံးရင်တော့ သူ့ရဲ့ Repo ထဲကနေ apt-get နဲ့ Install လုပ်လို့ရပါတယ် ဒါပေမယ့်သူက User creation တွေပါလုပ်ကုန်လို့ မလိုတဲ့ဟာတွေပါလို့ ကိုယ်တိုင်ပဲ Install လုပ်ယူတာကပိုပြီး ကိစ္စရှင်းပါတယ်။ အောက်မှာပြထားတဲ့ Commands တွေနဲ့ Gitosis ကို Install လုပ်ယူလိုက်ပါ။

root@gitserver:~# git clone git://eagain.net/gitosis.git
root@gitserver:~# cd gitosis
root@gitserver:~# python setup.py install

Gitosis ကို Install လုပ်ပြီးပြီဆိုရင်တော့ အရင်ကလုပ်ထားတဲ့ Authorized Key တွေကို ပြန်ပြင်ဖို့လိုပါလိမ့်မယ်။ အရင်ကရေးထားတဲ့ authorized_keys ကိုတစ်နေရာမှာ Backup လုပ်ထားဖို့လိုပါမယ်။ Gitosis မှာတော့ Admin လုပ့်မယ့်လူတစ်ယောက်ကိုတော့ authorized_keys မှာထည့်ပေးပါတယ်။ Admin တာဝန်ယူမယ့်လူရဲ့ Key ဟာ Git user ရဲ့ home အောက်မှာ id_rsa_admin.pub လို့ရှိနေတယ်လို့ ယူဆထားပါတယ်။ နောက်ပြီးတော့ Git User Account ကို Shell Access ပြန်ပေးဖို့လိုပါတယ်။ Gitosis ကိုအောက်မှာပြထားတဲ့ Commands တွေနဲ့ Initialize လုပ်လို့ရပါတယ်။

root@gitserver:~# chsh -s /bin/bash git
root@gitserver:~# su git
git@gitserver:~$ cd ~/
git@gitserver:~$ mv ~/.ssh/authorized_keys ~/.ssh/authorized_keys.backup
git@gitserver:~$ gitosis-init < id_rsa_admin.pub git@gitserver:~$ chmod 755 ~/repositories/gitosis-admin.git/hooks/post-update

Gitosis မှာထူးခြားတာက Repository တွေကို Manage လုပ်တာက Git နဲ့ပဲလုပ်ပါတယ် Git Server ပေါ်မှာ Management လုပ်ဖို့အတွက် သီးသန့်အနေနဲ့ Repository တစ်ခုပါလာပြီးဖြစ်ပြီးတော့ အဲဒီ့ Repository ထဲက File တွေကိုလိုအပ်သလိုပြင် ပြီးရင်တော့ ပြန်ပြီးတော့ Server ပေါ်ကို Push လုပ်ရပါတယ်။ အောက်မှာပြထားသလို Clone လုပ်ယူလို့ရပါတယ် Clone လုပ်ဖို့အတွက်တော့ Gitosis ကို Configure လုပ်ခဲ့တုံးက id_rsa_admin.pub ရဲ့ပိုင်ရှင်ဖြစ်ဖို့လိုပါမယ်။

git_admin@gitclient:~$ clone git@gitserver:gitosis-admin.git

gitosis-admin ဆိုတဲ့ Repository ထဲမှာ ရှုပ်ရှုပ်ထွေးထွေးမပါပါဘူး keydir ဆိုတဲ့ Folder တစ်ခုရယ် gitosis.conf ဆိုတဲ့ ဖိုင်တစ်ခုရယ်ပဲပါတယ်။ User တစ်ယောက်အသစ်ထည့်ချင်ရင် အရင်ကဆိုရင် Public Key ကို authorized_keys ထဲကိုသွားရေးပေးရတယ်။ Gitosis မှာတော့ username.pub ဆိုပြီး Public Key File ကိုနာမည်ပေးပြီး keydir ထဲကိုကူးထည့် ဆာဗာပေါ်ကိုပြန်ပြီးတော့ Push လုပ်ပေးလိုက်ရုံပါပဲ။ Repository တစ်ခု အသစ်လုပ်မယ်ဆိုရင် အောက်မှာပြထားသလို gitosis.conf ထဲမှာသွားရေးပေးရပါတယ်။ ပြီးရင်တော့ Server ပေါ်ကိုပြန်ပြီးတော့ Push လုပ်ပါ အဲဒါဆိုရင် Gitosis ကလိုအပ်တာတွေကို Initialize လုပ်ပါလိမ့်မယ်။

[group my_repo_write]
writable = myrepo
members = user1 user2

[group my_repo_read]
readonly = myrepo
members = user3 user4

အဲဒါဆိုရင် myrepo ဆိုတဲ့ Repository ထဲမှာ user1 နဲ့ user2 တို့နှစ်ယောက်ဟာ ရေးခွင့်ဖတ်ခွင့်ရှိတယ်။ user3 နဲ့ user4 ကတော့ ဖတ်ခွင့်ပဲရှိတယ်။ အရင်တုံးက Shell တစ်ခုကို Share လုပ်နေတုံးကဆိုရင် အဲလိုဖတ်ခွင့်ပဲပေးပြီး ရေးခွင့်မပေးချင်လို့မရပါဘူး အခုတော့ရပါတယ်။ အရင်တုံးကလို myrepo ကို Server ပေါ်မှာ Initialize လည်းလုပ်ပေးဖို့မလိုအပ်ပါဘူး Repository မရှိသေးလည်း ပထမဆုံးအကြိမ် Client ကနေ Push လုပ်တဲ့အချိန်မှာ Gitosis ကပဲ လုပ်သွားပါလိမ့်မယ်။ အဲဒါတွေပြီးရင်တော့ အောက်မှာပြထားသလို သုံးလို့ရပါပြီ။

user1@gitclient:~$ git init
user1@gitclient:~$ git remote add origin git@gitserver:myrepo.git
user1@gitclient:~$ git push origin master

ဒါဆိုရင် Gitosis ကိုသုံးပြီးတော့ Git Repository Server တစ်ခုလုပ်လို့ရပါပြီ ခက်ခက်ခဲခဲမရှိလှပါဘူး Git Repository Server ဟာ Public IP နဲ့ဆိုရင် ဘယ်နေရာကဖြစ်ဖြစ် သုံးလို့ရပါတယ် အခုကတော့ SSH ပေါ်ကနေပဲ အလုပ်လုပ်ပါတယ် အဲဒါကြောင့် မြန်မာနိုင်ငံထဲ ပြန်ရောက်နေလို့ Push လုပ်ချင်လို့ပါဆိုရင်တော့ မဖြစ်နိုင်ပါဘူး။ အဲဒါတွေအတွက်ဆိုရင်တော့ Firewall အများစုဖွင့်ထားတဲ့ http ပေါ်ကနေ Push လုပ်ဖို့ထပ်ပြီးတော့ Setup လုပ်ရပါလိမ့်မယ်။ နောက်အားတဲ့အခါမှ ဆက်ရေးပါဦးမယ်။

How to setup a simple Git Repository Server?

Git Server တစ်ခုလုပ်ယူရတာ သိပ်ပြီးတော့ မခက်ခဲလှပါဘူး ရုံးမှာတစ်ယောက်တစ်ပေါက် Revision Control တစ်ခုခုတင်ပေးပါ ပြောပြောနေလို့ Git Server တစ်ခုလုပ်ပေးဖို့ တာဝန်ကျလာပါတယ်။ Server ပေါ်မှာ Git အတွက် User Account တစ်ခုခွဲထားလို်က်ပြီး Repository တွေကိုသိမ်းလို့ရပါတယ်။ အလွယ်ဆုံးနည်းကတော့ ခွဲထားတဲ့ User Account တစ်ခုနဲ့ အားလုံးသုံးမှာဖြစ်တဲ့အတွက် Password ကိုအားလုံးကို ပေးထားတာထက် Authorized Key နဲ့ဝင်တာ အဆင်အပြေဆုံးပါပဲ။ အောက်မှာပြထားတဲ့ Command တွေနဲ့ git ဆိုတဲ့ User တစ်ယောက်ကို Create လုပ်လို့ပြီး Authorized Key အတွက် Folder တစ်ခုထည့်လို့ရပါတယ်။

root@gitserver:~# adduser -m git
root@gitserver:~# su git
git@gitserver:~$ cd ~
git@gitserver:~$ mkdir .ssh

ပြီးပြီဆိုရင်တော့ ကိုယ့်ရဲ့ Git Server ကိုသုံးမယ့်လူတွေရဲ့ Public Key တွေကို .ssh အောက်ထဲမှာ authorized_keys ဆိုတဲ့ဖိုင် အနေနဲ့ထည့်ပေးရပါမယ်။ ကိုယ့်အထဲမှာ သုံးမယ့်လူတွေရဲ့ Public Key တွေရှိပြီးသားဆိုရင်တော့ အောက်မှာပြထားသလို အလွယ်တကူပဲရေးလို့ရပါတယ်။ ဒါမှမဟုတ်လည်း authorized_keys ကို Editor တစ်ခုနဲ့ဖွင့်ပြီး ထပ်ထပ်ထည့်လည်းရပါတယ် ခက်ခက်ခဲခဲမဟုတ်ပါဘူး။

git@gitserver:~$ cd ~/.ssh
git@gitserver:~$ cat mg_mg_id_rsa.pub >> authorized_keys
git@gitserver:~$ cat ma_ma_id_rsa.pub >> authorized_keys

ဒါဆိုရင် mg_mg_id_rsa.pub နဲ့ ma_ma_id_rsa.pub နှစ်ယောက်ဟာ git ဆိုတဲ့ User Account ကိုသူတို့ရဲ့ Private Key တွေနဲ့ SSH ကို Access လုပ်လို့ရပါပြီ။ Server ဘက်မှာတော့ Repository ကို Initialize လုပ်ပေးဖို့ပဲကျန်တော့တယ်။ အောက်မှာပြထားတဲ့ Command တွေနဲ့လုပ်လို့ရပါတယ်။ Git Repository Initialize လုပ်တာက Server ဖြစ်တဲ့အတွက် Working Directory မလိုပဲလုပ်ရပါတယ် အဲဒီ့အတွက် –bare ဆိုတဲ့ Option တစ်ခုပါဖို့ သတိထားရပါတယ်။

git@gitserver:~$ cd ~
git@gitserver:~$ mkdir myproject.git
git@gitserver:~$ cd myproject.git
git@gitserver:~$ git –bare init

ဒါတွေပြီးရင်တော့ Client အနေနဲ့ သုံးလို့ရပါပြီ။ သုံးခွင့်က mg_mg_id_rsa.pub နဲ့ ma_ma_id_rsa.pub နှစ်ယောက်ကို ပေးထားတဲ့အတွက် အဲဒီ့လူတစ်ယောက်ယောက်ရဲ့ Private Key ရှိတဲ့ ကွန်ပျူတာတစ်လုံးကနေ Clone လုပ်ကြည့်မယ်ဆိုရင် ရပါလိမ့်မယ်။

mgmg@computer:~$ cd ~
mgmg@computer:~$ git clone git@gitserver:myproject.git
mgmg@computer:~$ cd myproject
mgmg@computer:~$ touch README
mgmg@computer:~$ git add .
mgmg@computer:~$ git commit -am “Initial Commit”
mgmg@computer:~$ git push origin master

သုံးလို့ရသွားပြီဆိုပေမယ့် ထပ်ဖြစ်လာတဲ့ ပြဿနာက mg_mg_id_rsa.pub နဲ့ ma_ma_id_rsa.pub နှစ်ယောက်ဟာ git ဆိုတဲ့ User Account ကိုသူတို့ရဲ့ Private Key တွေနဲ့ SSH ကို Access လုပ်လို့ရနေပါတယ်။ အကယ်လို့ သူတို့နှစ်ယောက်ဟာ ဆာဗာပေါ်မှာ Shell Access မလုပ်စေချင်ရင်တော့ git ဆိုတဲ့ User Account အတွက်ပေးထားတဲ့ Shell ကိုပြင်ဖို့လိုပါတယ်။ Git မှာ git-shell ဆိုပြီးပါပြီးသားရှိပါတယ် အဲဒါကိုပဲသုံးစေမယ်ဆိုရင်တော့ Repository List ကလွဲရင်ကြည့်လို့မရအောင် လုပ်ပေးလို့ပါတယ်။

root@gitserver:~# cp -R /usr/share/doc/git-your-version/contrib/git-shell-commands /home/git
root@gitserver:~# chown -R git /home/git/git-shell-commands/
root@gitserver:~# chmod +x /home/git/git-shell-commands/help
root@gitserver:~# chmod +x /home/git/git-shell-commands/list
root@gitserver:~# chsh -s /usr/bin/git-shell git

အထက်မှာပြောခဲ့တဲ့အတိုင်း Setup လုပ်မယ်ဆိုရင် Git Server တစ်ခုအလွယ်တကူ လုပ်လို့ရပါတယ် ဒါပေမယ့် အလွယ်ဆုံးနည်းလမ်း ဖြစ်တဲ့အတွက် လိုအပ်ချက်တွေတိုးလာရင် အဆင်မပြေတော့ပါဘူး။ အခုလုပ်ထားတာက User Account တစ်ခုကို လူအများမျှပြီးသုံးတဲ့နေရာမှာ Public Key တွေကို authorized_keys ထဲကိုရေးပေးရတဲ့အတွက် လူများလာတာနဲ့အမျှ ထိမ်းချုပ်ရခက်ပါတယ် လူတစ်ယောက်ကို ပြန်ဖျက်ဖို့အတွက် authorized_keys ကိုပြန်ဖွင့်ပြီး တစ်ခုစီလိုက်ရှာရတာ အတော်ခက်ခဲ့ပါလိမ့်မယ်။ နောက်တစ်ချက်က လူတိုင်းမှာတူညီတဲ့ လုပ်ပိုင်ခွင့်ဖြစ်နေပါတယ် သုံးခွင့်ရှိတယ်ဆိုတာနဲ့ ရှိသမျှ Repository တွေကို Access လုပ်လို့ရပါတယ်။ အဲဒီလိုအပ်ချက်တွေ တိုးလာရင်တော့ အခြားသော Git Server Management Tools တွေသုံးရပါလိမ့်မယ်။