Navod na pracu so systemom git ===== Git windows ===== [[howto:git_windows|Git windows]] ===== Instalacia systemu ===== Instalaciu systemu git. Pre distribuciu *ubuntu/debian: sudo apt-get install git ===== Zoznam repozitarov - server ===== Na servri phoenix sa nachadzaju repozitare na ceste: /home/git/repositories/ Repozitare cez https su pristupne na ceste https://git.emza.inside.transdata.sk/git/nazov_repozitaru) [[howto:list_of_git_repositories|Zoznam repozitarov]] ===== Pridanie noveho repozitara ===== Pridavanie noveho repozitara vykonava spraca git repozitarov M.Chyla. Kazdy novy repozitar je POTREBNE zdokumentovat na tejto wiki stranky, minimalne kratkym popisom na co dany repozitar sluzi. **Nazvoslovie pridavaneho repozitaru:** * Vsetky pismena malym pismom - standardne zauzivane pravidlo pre spravu git repozitarov * Pouzivaju sa len pismena a cislice, ziadne ine znaky nie su povolene ===== Prvotne nastavenie - server ===== Vstupne premenne pre navod: * Git server - phoenix ( 192.168.241.14 ) * Standardna cesta pre git repozitare : phoenix:/home/git/repositories Na zaklade definovanych ciest je mozne vytvorit repozitar [[http://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server|Vytvorenie repozitara ]] ===== Prvotne nastavenie - klient ===== * Vytvorenie lokalnej identity pre pracu so systemom: [[http://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup#Your-Identity|Identita]] git config --global user.name "John Doe" git config --global user.email johndoe@example.com * Ak chcete nastavit iny ako systemovy defaultny editor pre git: [[http://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup#Your-Editor|Prednastavenie systemoveho editoru]] * Kontrola spravnosti nastavenia identity: [[http://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup#Checking-Your-Settings|Kontrola identity]] git config --list * Vytvorenie suboru na nastavovanie ignorovanych suborov git-kom ( pre vsetky projekty ) napr. *.o *.so, alebo si ho stiahnut z phoenixa. cp /usr/local/emtest/DevelInstall/git/.gitignore_global ~/.gitignore_global ALEBO ln -s /usr/local/emtest/DevelInstall/git/.gitignore_global ~/.gitignore_global Nasledne vykonat 'git config'. Pri update suboru prikaz nie je potrebny: git config --global core.excludesfile ~/.gitignore_global ===== Emailove notifikacie pull requestov ===== Emailove notifikacie pre pull requesty su implementovane pomocou rozsirenia nastroja smartgit: [[https://www.syntevo.com/doc/display/SG/Server-side+component|Server side component]] Rozsirenie sa nachadza na phoenixe na ceste: /home/git/smartgit-reviewserver Kazdy repozitar pozadujuci emailove notifikacie musi mat v git hookoch skript post-receive nachadzajuci sa na /home/git/.git-templates/hooks ===== Pristup k repozitarom ===== Po dohode sa robi clone zdrojovych suborov na lokalny pocitac na cestu: /opt/devel/src/ ==== Zoznam git uzivatelov a pristup k repozitarom ==== ^ Uzivatel ^ Dostupne repozitare ^ typ SSH pristupu ^ Prava ^ | prosoft | vendingmachine.git \\ vendingmachineui.git | git-shell | R+W | | git | vsetky repozitare | git-shell | R+W | Pristup ku git repozitarom je rieseny na zaklade vymeny SSH klucov medzi klientom a servrom. Pri prihlaseni sa cez ssh pod spominanymi uzivatelmi je 'Git shell' nastaveny z bezpecnostneho dovodu, vid [[http://git-scm.com/docs/git-shell|Nastavenie git-shell]]. Git shell umoznuje pracu len s repozitarom a neumoznuje pracu so servrom. Prava su riesene na systemovej urovni pomocou uzivatelov a group: [[https://wincent.com/wiki/git_repository_access_control|Nastavenie prav pri ssh pristupe ku gitu]]. ==== Clone repozitaru ==== Pre pristup k repozitarom pomocou uzivatela git je potrebne, aby spravca repozitara pridal vase verejne kluce do authorized_keys na serveri phoenix. Ak este nemate vygenerovane verejne kluce, navstivte sekciu: [[http://192.168.241.14/wiki/doku.php?id=coding:rules_phoenix#prihlasovanie_vymena_klucov|vymena a generovanie verejnych klucov]] Git repozitar sa ziska zo servra prikazom: git clone git@192.168.241.14:/pozadovany_repozitar.git ==== Clone repozitaru s podmodulmi ==== Manual pre pracu so podmodulmi: [[http://git-scm.com/book/en/v2/Git-Tools-Submodules|Podmoduly]] V pripade, ze repozitar ma nastavenu zavislost na iny repozitar tak sa repozitar ziska aj s podmodulmi nasledovne: git clone --recursive git@192.168.241.14:/pozadovany_repozitar.git Realny priklad repozitaru s podmodulmi: git clone --recursive git@192.168.241.14:/vehiclesystemapps.git VehicleSystem Repozitar VehicleSystem obsahuje zdrojove subory pre citacku a palubny pocitac. Okrem aplikacii su do repozitara dolinkovane aj repozitare: **Core**, **DataIO**, **AppCore**, **ApplicationTexts**, **CommonDevices**, **OBCDevices**, **OBCUI**, **SlaveUI**, **Dispatching**. Stiahnutie repozitaru s podmodulmi konkretny branch: git clone --recursive -b develop git@192.168.241.14:/vehiclesystemapps.git VehicleSystem Priznak '--recursive' stahuje aj podmoduly. Ked sa '--recursive' nepouzije, podmoduly sa nestiahnu ale budu reprezentovane prazdnymi priecinkami. ===== Praca s repozitarom ===== Vykonavanie a nahravanie zmien do lokalneho a vzdialeneho repozitara [[http://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository|zmeny v repozitaroch]] Overenie zmien lokalneho repozitara so vzdialenym repozitarom [[http://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes#Fetching-and-Pulling-from-Your-Remotes|porovnavanie zmien]] Stiahnutie poslednych zmien v submoduloch: git pull --recurse-submodules Ak boli pridane nove podmoduly tak je potrebny prepinac --init: git submodule update --init --recursive Overenie aktualne nastaveneho branch-a/HEAD-u: git log --oneline --decorate Nastavenie branche-u celom repozitari aj s podmodulmi: git submodule foreach --recursive git checkout master ==== Dokumentovanie a tvorba komentarov zmien do git-u ==== Velmi dolezitu sucast prace so systemom git predstavuje pisanie poznamok pri nahravni zmien do repozitara. Z komentarov v repozitari sa generuje vyvojarsky changelog, ktory dokumentuje vyvoj produktu. Nahravanie zmien do repozitaru rozdelujeme do styroch zakladnych operacii: - Oprava chyby - chyby su opravovane na zaklade task-u v systeme mantis (helpdesk), - Implementacia novej poziadavky - nove poziadavky su implementovane vyhradne na zaklade task-u v systeme redmine, - Refaktoring, - Nahravanie hash-ov podmodulov repozitaru Format komentarov pre operacie: === Oprava chyby - system Mantis/Helpdesk=== BugID CISLO_CHYBY_V_SYSTEME_MANTIS - zrozumitelny popis vykonanych uprav/oprav === Oprava chyby - system Redmine=== RedmineBug #CISLO_CHYBY_V_SYSTEME_MANTIS - zrozumitelny popis vykonanych uprav/oprav === Implementacia novej poziadavky === RedmineTask #CISLO_TASKU_V_SYSTEME_REDMINE - zruzumitelny popis implementovanej vlastnosti **#** - Mriezka pred cislom je dolzeita pretoze redmine si vie nasledovne na zaklade tohto sparovat repozitar a redmine task. === Refaktoring === Refaktoring - preco sa kod prerabal + zrozumitelny popis vykonanych uprav === Nahravanie hash-ov podmodulov repozitaru === Commit NAZOV_PODMODULU hash - popis vykonanych uprav nad podmodulom od posledneho nahratia hash-u ==== Pridanie podmodulu ==== Pridanie podmodulu je mozne vykonat prikazom: git submodule add git@192.168.241.14:/home/git/repositories/repozitar.git nazov_priecinka_pre_podmodul Commit a push zmien sa vykona prikazom: git commit -m "added NAZOV_MODULU module" http://git-scm.com/book/en/v2/Git-Tools-Submodules ==== Odstranenie podmodulu ==== Odstranenie podomodulu je potrebne konzultovat so spravcom repozitara Pre odstranenie podmodulu je potrebne vykonat sadu prikazov: git submodule deinit nazov_podmodulu git rm nazov_podmodulu git rm --cached nazov_podmodulu rm -rf .git/modules/nazov_podmodulu ===== Merge v nastroji smartgit ===== * Nastavime sa do branche-u, do ktoreho chceme zmeny merge-nut. Priklad merge-u release branche-u 'release/1501' do develop branche-u 'develop' * V nastroji SmartGIT zvolime branche, ktory si zelame merge-nut. Na obrazku, je zvoleny branche 'origin/release/1501' {{howto:merge_select_branche_to_merge.png|Merge release/1501 do brnache-u develop}} * zvolime operaciu 'Merge'. Nastroj SmartGIT umoznuje dva scenare merge-u: * **Create merge-commit** - nastroj smartgit zluci/mergne zmeny zvoleneho branche-u do cieloveho branche-u a vytvori automaticku merge spravu 'Merge branch 'nazov branche-u'. V pripade, ze merge obsahuje konflikt, smartgit sa automaticky prepne do druheho stavu 'merge to working tree' * **Merge to working tree** - nastroj smartgit zluci/mergne zmeny zvoleneho branche-u do cieloveho branche-u ale oproti predchadzajucej moznosti necha commit a riesenie konfliktov na uzivatela. Uzivatel musi rucne commit-nut a pushnut zmeny {{howto:question_merge_type.png|}} * **Fast-Forward** - v pripade ze sa nad aktualnym brancheom, do ktoreho sa chystate mergovat nevykonala ziadna zmena, tak nie je potrebny merge. Tento specialny pripad merge-u nastavi len hlavicku a nevytvara sa ziadny merge commit. {{howto:merge_fast_forward1.png|}} * Po merge rucne prejdeme a overime vsetky zmeny v zdrojovych kodoch * V pripade ze merge-ujeme kniznicu, zdvihneme verziu v .pro subore * Nahranie zmien do repozitara s formatom spravy: Merge remote-tracking branch 'BRANCHE_Z' into BRANCH_DO ( riadok generovnay smartGIT-om) Resolved conflicts: ( riadok generovnay smartGIT-om) NAZVY SUBOROV - v ktorych boli vyriesene konflikty. Potencionalne problemy, preto je spravne ich dat do logu ( riadok generovnay smartGIT-om) Features: ( rucne pisana sekcia ) popis zmien ===== Import zdrojovych suborov do repozitara ===== Pred prvou pracou s novym a prazdnym repozitarom je potrebne ho inicializovat prvym push-om do repozitara nasledovne: [[http://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository|]] $ cd myproject $ git init $ git add . $ git commit -m 'initial commit' $ git remote add origin git@192.168.241.14:/project.git $ git push origin master mozne problemy: - v pripade windows musia byt dvojite apostrofy: git commit -m "initial commit" - ak je pri vytvarani repozitara adresar prazdny moze vratit chybu: error: src refspec master does not match any. v tom pripade treba pridat do adresara nieco na comitnutie a opakovat kroky od kroku $ git add . ===== Online trening ===== [[https://try.github.io|Online trening]] [[http://www.microsoftvirtualacademy.com/training-courses/using-git-with-visual-studio-2013-jump-start|Using Git with Visual Studio 2013 Jump Start]] ===== Praca s programom SmartGit ===== V pripade prace s repozitarom, kde su nastavene aj podmoduly je potrebne/ziaduce, zapnut nasledovne nastavenie, aby pri fetch-y tahalo zmeny aj zo submodulov: {{howto:repositorysettings.png|}} {{howto:git-ssh.png|}} {{howto:git-hosting-provider.png|}} {{howto:smartgit-pull.png|}} === Pad programu SmartGit === Ak sa Vam stava, ze vam obcas padne smartgit pri prepinani medzi review komentarmi skuste zmenit v subore smartgit.sh nasledovne: export SWT_GTK3=0 na export SWT_GTK3=0 ===== Git flow system ===== Git flow predstavuje system prace, system release-ovania, branche-ovania a system implementacie novych vlastnosti nad verzionovacim systemom git. Pracu s git flow priblizuju clanky: * [[http://www.syntevo.com/smartgit/documentation/6.5/show?page=git-flow|Oficialna stranka Smartgit git-flow]] * [[https://blogs.endjin.com/2015/01/using-smartgit-to-follow-the-gitflow-branching-and-workflow-model/|nastavenie a pouzitie git-flow-u]] \\ ==== Vizualizacia systemu prace s gitflow ==== Pre podrobnejsi popis //Support Branches// v oficialnej dokumentacii {{howto:gitflow.png|}} ==== Nastavenie git flow - system releasovania a podpory ==== Nad repozitárom aj každým submodulom je potrebne nastaviť git flow {{howto:nastaveniegitflow.png|}} ==== Oprava chyby (hotfix) do stable verzie (master) ==== Postupnost opravy chyby v stable verzii (master) aplikacie: - Vyuziva sa gitflow system v nastroji smartgit, polozka 'Git-Flow' -> 'Start Hotfix' (aj nad kazdym upravovanym submodulom) - Nazov Hotfix branchov vo formate BugIDXXXXXX/RedmineBugXXXXXX ( hotfix/BugIDXXXXXX alebo hotfix/RedmineBugXXXXXX predpona hotfix sa pridava automaticky, v pripade opravy viacerych chyb naraz hotfix/BugIDXXXXXX_BugIDXXXXXX ... ), pricom XXXXXX prestavuje cislo bugu. Ku kazdemu hotfixu **MUSI** existovat chyba v systeme helpdesk alebo redmine(ak sa opravuje uz existujuci hofix tak XXXXXX_1, _2, ...) - Vykonanie potrebnych uprav nad hotfix branchom - Pri upravach submodulov / libiek pozor na to, ze treba aj zdvihnut verziu kniznice v .pro a projlibs.in (aj palubak aj citacku ak treba), ako aj v zavislych submoduloch (pozri: [[coding:libweb]]) - Commit zmien - Spojenie zmien branchu a stable verzie pomocou 'Git-flow' -> 'Finish hotfix'. Zmeny sa spoja do vetvy 'master' a 'develop' (pozor! stava sa, ze smartgit prepne repoztar nad submodulom do developu, co moze potom robit problemy pri finishovani hotfixu nad hlavnym repozitarom) ==== Implementacia feature do develop verzie ==== Postupnost prace z feature: - Vyuziva sa gitflow system v nastroji smartgit(licenciu distrubuuje spravca siete), polozka 'Git-Flow' -> 'Start Feature'. - Nazov feature branch-u: RedmineTaskCISLO_REDMINE_TASK - Implementacia potrebnej novej funkcionality - Ukoncenie feature polozka 'Git-Flow' -> 'Finish Feature'. - Vybrat polozku create simple commit a nasledne Finish {{howto:finishfeature1.png|}} ==== Prerelease - Vytvaranie zastabilizovanej verzie develop vetvy ==== Zastabilizovanie zmien sluzi na posledne doladenie funkcnosti nadchadzajuceho release-u. Do prerelease vetvy sa nedorabaju ziadne nove poziadavky ani refactoring. Postup vytvaranie prerelease-u: - Postupne povytvarat release vetvu pre kazdy podmodul hlavneho repozitaru - Vytvorit release vetvu pre hlavny repozitar ==== Ukoncenie prace na prerelease a zaclenenie zmien do master a develop vetvy ==== Po odladeni prerelease vetvy 'release/cislo_release-u' je potrebne zmeny zaclenit do master vetvy pre vytanie stable verzie. Postupnost zaclenenia zmien prerelease verzie 'release/cislo_release-u' do stable 'master' vetvy: - Vyuziva sa gitflow system v nastroji smartgit(licenciu distrubuuje spravca siete), polozka 'Git-Flow' -> 'Finish release'. - Nezabudnut dopisat Feature sekciu ako pri klasickom mergovani ==== Support release - podpora neaktualnych verzii produktu ==== Pred mergom //prerelase// vetvy do //master// vetvy sa vytvori //support// branch z hlavneho repozitara aj vsetkych podmodulov. Do //support// branch-u sa opravuju **LEN** kriticke chyby a to priamo a **NIE** pomocou hotfix tlacidla v git-flow-e. Po vykonani opravy nad //support// branch-om je potrebne zaclenit zmeny do //master// a //develop// vetvy, aby sa zabezpecilo, ze sa zmeny/opravy dostanu aj do najnovsej verzie. === Zaclenenie zmien zo support do master vetvy === Pre zaclenenie zmien je potrebne vykonat nasledovne kroky: - Vykonanie uprav nad //support// branch-om a jeho podmodulmy - pushnutie zmien v //support// branch-y do origin-u - Prepnutie sa do //master// vetvy - Vytvorenie hotfix-u podla pravidiel [[howto:git#oprava_chyby_hotfix_do_stable_verzie_master|Pravidla opravy chyb]] - Aplikacia zmien zo //support// branch-u pomocou //cherry-pick//( aplikovanie urcitej zmeny do specifickeho commit-u, v nasom pripade HEAD master-a ) do //master// vetvy - Ukoncenie hot-fixu zaclenenie zmien do master a develop vetvy ==== Ulozenie zmien nad aktualnym branch-om do stash-u ==== V pripade, ze mate rozrobene zmeny nad urcitym branch-om a potrebujete sa prepnut na iny( napriklad pre vytvorenie hotfixu ) je to mozne pomocou stash-nutia zmien pomocou tlacidla v smartgit 'local' -> 'save'. Musite byt nastaveny v navigacnom menu na podpomodule, ktory pozadujete ulozit ==== Integracia pull request-u ==== Ak mame pull request, ktory bol schvaleny, potrebujeme ho integrovat, teda zmeny vykonane v zdrojom branch-i pushnut do cieloveho branch-u. Pri integracii postupujeme nasledovne: * 1. Pullneme najnovsie zmeny v cielovom branch-i, aby bol cielovy branch aktualny * 2. Klikneme pravym tlacidlom na pull request, ktory chceme integrovat, a vyberieme moznost Integrate (integrovat) {{howto:integrate_01.png|}} * 3. Vyplnime commit message a zvolime "Create merge commit", zaskrtneme "Delete source branch ..." a "Push pull request and remote branch deletion" pre zmazanie zdrojoveho branch-u a pull requestu z origin. Klikneme na tlacidlo Integrate. {{howto:integrate_02.png|}} * 4. V pripade, ze pri mergovani dojde ku konfliktom, vyriesime ich pomocou Conflict Solver-a. {{howto:integrate_03.png|}} * 5. Po vyrieseni konfliktov staci uz len commitnut a pushnut zmeny do cieloveho branch-u. **Po pushnuti sa vsak zdrojovy branch ani pull request nezmazu, pretoze nastali konflikty.** Preto ich je potrebne manualne zmazat (staci znova integrovat pull request - vid krok 2 a 3). {{howto:integrate_04.png|}} Hotovo, zdrojovy branch bol mergnuty do cieloveho branch-u, o com sa mozno presvedcit v logu. ===== Zmena aktualnej hlavy podmodulu na hash z hlavneho repozitára v SmartGit ===== V prípade že podmodul je ručne nastavený na nejaký commit a chceme aby trackoval commity podľa hlavného repozitára (napríklad podmodul ApplicationTexts na globálny repozitár develop) stačí odstrániť zmenu hashu (discard ako na obrázku) v hlavnom repozitári a SmartGit prehodí aktuálny commit podmodulu na hash ktorý je uložený v hlavnom repozitári. {{howto:smartgitchangetracking.png|}} ===== Problemy pri praci s gitom ===== ==== Pridanie uzivatela do gitolite-u ==== Problem: Po pridani uzivatelo do gitolite-admin-u pytalo heslo pri pokuse o clone repozitaru.admin-u pytalo heslo pri pokuse o clone repozitaru. Problem sa mi podarilo vyriesit pomocou stranky: http://gitolite.com/gitolite/sts.html Sekcia: ssh deamon asks for a password Problem bol v tom ze nepridaval public key do authorized_keys. Prikazom 'gitolite setup' konfiguraky obnovil a pridal tam vsetky zname public key z repozitaru gitolite-admin. Nasledne uz vsetko fungovalo. Mozno sa vam to hodi ak budete riesit podobny problem. ==== Problem pri pridavani repozitara ==== Po pridani noveho repozitara je potrebne pre spravnu inicializaciu repozitara zavolat git init --bare **Sposobovalo to problemy pri stahovani:** user@user-PC:/tmp$ git clone git@192.168.241.14:/repo.git Cloning into 'repo'... FATAL: R any kernel sipikal DENIED by fallthru (or you mis-spelled the reponame) fatal: Could not read from remote repository. **Sposobovalo to problemy aj pri rekonfiguracii gitoliteu** git@Phoenix:~/gitolite/src$ ./gitolite setup FATAL: could not symlink /home/git/.gitolite/hooks/common/update to repo.git/hooks at /home/git/gitolite/src/lib/Gitolite/Conf/Store.pm line 371