Kodo versijavimas su GIT

Šiame straipsnyje norėčiau trumpai apžvelgti kodo versijavimo galimybes su GIT. Tikriausia daugelis esate girdėję ar net bandę įvairias versijavimo sistemas SVN, Mercurial ir panašias, jei ne tuomet turėtumėte skaityti dar atidžiau.
Taigi, pirmas klausimas ko man reikia ir nuo ko pradėti? Na pirmiausia turiu nuraminti – padaryti galime beveik bet ką, tad susidėliokime poreikius.
Imkime dažniausiai pasitaikančią situaciją: dirba keli programuotojai prie vieno projekto, kelia savo kodą į development serverį ir tam tikrais etapais keliamas kodas į production serverį.
Tai ir pradedame. Visuose serveriuose bei programuotojų kompiuteriuose įdiegiame GIT, kaip tai padaryti rasite http://git-scm.com. Development serveryje sukuriame repositoriją. Kadangi development serveris yra kuo normaliausias web serveris (t.y. neskirtas vien kodo versijavimui) tai repositorijos vietą gali padiktuoti Jūsų naudojama sistema. Mano atveju tai yra virtualmin valdymo panelė, kuri kiekvienam vartotojui sukuria po naują vartotoją sistemoje. Taigi repositoriją talpinsime vartotojo namų kataloge, pvz.: /home/user1/projektas1. Prisijungiame prie serverio kaip user1 ir vedame komandas:

mkdir /home/user1/projektas1;
cd projektas1;
git init;
echo 'hello world' > index.php;
git add *;
git commit -m "pirmas commitas";
git branch develop;

Viskas, repositorija sukurta. Sekantis žingsnis – programuotojų kompiuteriai. Pirmiausia reikia pasirūpinti prisijungimu prie serverio, man patogiausias būdas yra SSH su viešais ir privačiais raktais. Taigi jei jau programuotojas gali prisijungti prie serverio tuomet pas ji vykdome tokias komandas:

mkdir -p ~/git;
git clone ssh://user1@development_serverio_adresas:portas/home/user1/projektas1;
cd projektas1;
git config user.name "Programuotojo vardas";
git config user.email "programuotojas@imones_pavadinimas";

Pakoreguojame failą ~/git/projektas1/.git/config taip, kad visur vietoje master būtų įrašyta develop (turėtų būti 2 vietos) ir išsaugokime. Tuomet dar pora komandų:

git branch develop;
git checkout develop;
git pull;

Programuotojas jau gali pradėti savo darbą.

echo 'pakeistas failas' > index.php;
git add *;
git commit -m "pakeitimai";
git pull;
git push;

Pakeitimai sėkmingai patalpinami development serveryje. Neišsigąskite jei nematote pakeitimų development serverio kataloge /home/user1/projektas1, tai tik repostorija. Sukonfiguruokime automatinį kodo įkelimą development serveryje:

cd;
git clone projektas1 public_html develop;
echo 'cd /home/user1/public_html;env -i /usr/bin/git pull /home/user1/projektas1/ develop;' > git.sh;
chmod +x git.sh;
echo 'cd /home/user1;./git.sh;' > projektas1/.git/hooks/post-receive;
chmod +x projektas1/.git/hooks/post-receive;

Dabar programuotojui įkėlus pakeitimus į repositoriją ji automatiškai atnaujins ir klonuotą repositoriją esančią /home/user1/public_html. Nuorodome web serveriui, kad ieškotų failų ten ir viskas.
Pasidarėme paprastutę sistemėlę su dvejomis šakomis master ir develop. Šaka develop bus skirta darbui development serveryje, o šaka master bus stable ir ją kelsime į production serverius. Sekantis žingsnis – production serveriai. Juose iš esmės bus tas pats, tiesiog klonuojame repositorijos šaką master:

git clone ssh://user1@development_serverio_adresas:portas/home/user1/projektas1 /home/user1/public_html

Kai reikės įkelti pakeitimus į production serverius, reikia development sistemoje atlikti tokias komandas:

cd /home/user1/projektas1;
git branch master;
git merge develop;

Šaka master bus sulyginta su šaka develop, o production serveriuose tiesiog užteks prisijungti prie jų ir /home/user1/public_html kataloge paleisti komandą „git pull;„.
Kadangi nematau prasmės versti dokumentaciją, tai tikrai patariu Jums ją pasiskaityti, sužinosite daugiau apie repositorijų šakojimąsi, bei įvairius hooks kurie gali padėti automatizuoti sistemą, pagal Jūsų poreikius. O pas mus gavosi tokia schema:

Kaip matote turint vaizduotės ir tokį kodo versijavimą kaip GIT – galite nuveikti daug dalykų kur kas paprasčiau nei iki šiol tai darydavome. Šioje vietoje svarbu paminėti, tai, kad negalima laikyti serverio pusėje besikeičiančių failų ant git’o, nes jei bandysite atsisiųsti pakeitimus iš repositorijos, o pas Jus bus nepakomitintų failų pakeitimų – GIT praneš apie klaidą. Pavyzdžiui, sistemoje yra galimybė įkelti paveiksliukus, juos trinti, keisti ar perkelinėti, tai tie pakeitimai programuotojams yra nesvarbūs, jei tik nori savo kodą patalpinti į serverį. Tokiu atveju serveryje nuklonavus repositoriją drąsiai kuriame ten katalogą kuriame laikysime paveiksliukus, o GIT apie tai „nežinos“ ir neseks pakeitimų iki tol kol neįvykdysite komandos „git add *;„. To iš tikro ir nereikia, nes mūsų sistemoje serveris tik atsisiunčia pakeitimus.
Reikia pastebėti, kad šiame straipsnyje aprašytas, šakojimo ir kodo atnaujinimas serveruose, būdas nėra vienintelis ar teisingesnis už kitus, tai yra tik vienas iš daugybės variantų, apie kuriuos galite pasidalinti komentaruose.

Žygimantas

Lead developer at Soundest. Zend Certified Engineer.

More Posts - Website

Žymos: , ,

3 komentarai

  1. Įdiegit wp-geshi higlaiterį. Visiškai nesižiūri dabar kodas. Ar bent jau preformatinkit pre tagą

  2. Būtų didelis pliusas naudoti Gource prie Git ar kitą versijavimo sistemą. 😉 Dideliuose projektuose praverčia. http://www.youtube.com/watch?v=jhbzEwxbCfI

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *

Galite naudoti šias HTML žymas ir atributus: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>