====== Redmine a Git ====== Poznámky o migraci ze Subversion na Git mám např. v souboru /net/work/people/zeman/hamledt/README.txt (resp. v repozitáři HamleDT, který jsem také stěhoval ze Subversion na Github). Tam je navíc oproti postupu popsanému zde popsáno ještě použití čističe historie BFG (https://rtyley.github.io/bfg-repo-cleaner/). Soubor users.txt se jmény a adresy vývojářů mám dosud o patro výš (/net/work/people/zeman/users.txt). Viz též http://git-scm.com/book/es/v2/Git-and-Other-Systems-Migrating-to-Git. Následující postup předpokládá, že jsem nejdříve vytvořil na Githubu prázdný repozitář ''dzparser''. git svn clone https://svn.ms.mff.cuni.cz/svn/dzparser --authors-file=users.txt --no-metadata --trunk=trunk --prefix=svn/ cd dzparser git remote add origin git@github.com:dan-zeman/dzparser.git git branch --set-upstream-to=origin/master master git pull origin master git push origin master # https://github.com/dan-zeman/dzparser.git ÚFALí server Redmine je na adrese https://redmine.ms.mff.cuni.cz/projects. Na wiki stránce s [[:navody|návody]] máme informace o [[:internal:redmine|nastavení osobního účtu na Redminu]]. Ještě než se používání Redmine na ÚFALu dostatečně rozšířilo, objevil se nový trend vytvářet naše repozitáře pod organizací ''ufal'' na [[https://github.com/ufal|Githubu]]. Ve výše uvedeném návodu pro osobní účty na Redminu jsou některé rady, které jsou užitečné i pro Github, zejména pokud jde o používání klíčů SSH při přihlašování: source keylogin.sh git clone git clone https://daniel.zeman@redmine.ms.mff.cuni.cz/upper-sorbian-proj/upper-sorbian.git jmeno_pracovni_kopie Dokumentace ke gitu je například [[http://git-scm.com/documentation|tady]]. * ''git clone '' ... naklonovat existující repozitář (dělá se na začátku podobně jako ''svn checkout'', ale sémantika není stejná) * ''git status'' ... v jakém stavu jsou jednotlivé soubory? (untracked / committed / modified / staged) * ''git add '' ... zkopírovat změněný soubor do staging oblasti nebo zahrnout do verzování dosud neverzovaný soubor (rovnou se dostane do staging oblasti) * ''git reset HEAD '' ... vyřadit soubor ze staging oblasti * ''git checkout -- '' ... zapomenout změny v pracovní kopii a vrátit se k verzi souboru uložené v repozitáři * ''git checkout -f'' ... zapomenout všechny změny všech souborů v pracovní kopii a vrátit se k poslednímu commitu v repozitáři * ''git commit -m 'log''' ... uložit soubory ze staging oblasti do (lokálního!) repozitáře; na vzdálený server to pořád nemá vliv * ''git commit -a'' ... přeskočit stageování a uložit i soubory, které už sledujeme, změnily se, ale nejsou ve staging oblasti * ''.gitignore'' ... soubor se jmény či šablonami jmen souborů, které se nemají verzovat a nemají se ani hlásit jako neverzované * ''git diff'' ... co jsem změnil, ale ještě nezkopíroval do staging oblasti * ''git diff --cached'' ... co jsem změnil a zkopíroval do staging oblasti * ''git log'' ... historie uložených verzí * ''gitk'' ... grafický program, který vizualizuje výstup ''git log'' * ''git rm '' ... odstranit soubor z pracovní složky a říct gitu, že ho má přestat sledovat * ''git rm --cached '' ... přestat sledovat soubor, ale jeho kopii v pracovní složce ponechat * ''git mv '' ... přejmenovat nebo přesunout soubor * ''git remote -v'' ... zobrazit názvy nakonfigurovaných vzdálených repozitářů včetně jejich URL. "origin" je ten, ze kterého jsme se naklonovali. * ''git remote add '' ... přidat vzdálený repozitář, se kterým se můžeme synchronizovat * ''git remote add origin git@github.com:ufal/treex.git'' * ''git branch --set-upstream-to=origin/master master'' * ''git remote rm '' ... odebrat spojení se vzdáleným repozitářem (nikoli vzdálený repozitář jako takový, ten zůstane nedotčen) * ''git fetch origin'' ... stáhnout nové změny ze vzdáleného repozitáře origin. Stáhnou se jako nová větev a neslijí se s mou aktuální větví, dokud to neudělám ručně. * ''git pull origin'' ... stáhnout nové změny a pokusit se je automaticky slít s mými. Musíme mít nakonfigurováno automatické sledování vzdálené větve. Ale u originu to tak defaultně je. * ''git push origin master'' ... odeslat změny v mé hlavní (master) větvi zpět na server, ze kterého jsem se naklonoval (origin) * ''git remote show origin'' ... zobrazit informace o stavu vzdáleného repozitáře ve vztahu ke mně * ''git branch testing'' ... vytvořit novou větev testing (rozvětvení bude na aktuálním commitu), ale zatím do ní nepřepínat (na aktuální větev ukazuje ukazatel HEAD) * ''git checkout testing'' ... přepnout se do existující větve testing a vybalit její soubory do pracovní složky * ''git checkout -b testing'' ... zkratka: vytvořit novou větev a hned se do ní přepnout * ''git checkout -b testing dfcb57a2'' ... vrátit se k revizi (commitu) s kódem ''dfcb57a2'', na něm vytvořit novou větev ''testing'' a hned se do ní přepnout. Při návratu k revizi, která současně není na konci nějaké větve, se doporučuje založit novou větev, aby HEAD vždy ukazovalo na větev a ne na pouhou revizi. Předchází se tím případným problémům, ke kterým může dojít, jestliže nad touto revizí provedeme nové změny: fakticky by vznikla nová větev, ta by ale neměla název a systém by mohl usoudit, že ji smaže, protože není potřeba. * ''git merge testing'' ... slít větev testing s mou aktuální větví * ''git branch -d testing'' ... zrušit větev, kterou už nepotřebujeme, protože jsme ji slili s jinou * ''git checkout -b serverfix origin/serverfix'' ... založit větev serverfix na základě nové větve, kterou jsme získali fetchem ze serveru origin, a přepnout se do ní. Současně tím vzniká vztah mezi novou lokální a vzdálenou větví. Tento vztah se vezme v potaz při synchronizaci pomocí push a pull. * ''git push origin :serverfix'' ... smazat větev serverfix na serveru origin ("na mé straně před dvojtečkou vezmi nic a udělej z toho aktuální stav větve serverfix na straně serveru") * ''git rebase '' ... práce se záplatami (patches) je jiný způsob, jak slít dvě větve. Výsledek je stejný, ale historie je přímější, samostatná větev v ní nebude vidět. Rebase přehraje na větvi base změny provedené ve větvi topic. ALE: Nemají se rebaseovat commity, které už jsme odeslali do veřejného repozitáře. Rebasing vyrábí nové commity, které mají stejný obsah, ale nejsou stejné. Pokud spolupracuji s někým jiným, kdo měl v ruce ty předchozí, nyní zavržené commity, vznikne binec, který budeme obtížně dávat dohromady. Vizualizace commitů v okenním prostředí na Linuxu: gitk -a