Git a Subversion

11. 8. 2008
Doba čtení: 3 minuty

Sdílet

Protože Git nabízí řadu možností pro zvýšení efektivity práce v distribuovaném vývojářském prostředí, dá se očekávat, že budou existovat i prostředky pro spolupráci s jinými systémy pro správu verzí. Dnes se podíváme na utilitu git-svn, která zajišťuje spolupráci Git a Subversion.

Ve světe open source software existuje několik skupin lidí – autoři, uživatelé a také správci balíčků a nezávislí vývojáři. Úkolem správců balíčků je ze zdrojového archívu udělat balíček, který splňuje požadavky dané distribuce a případně i opravuje chyby. Při řešení chyb je více než vhodné spolupracovat s autorem nebo autory daného programu. Za nezávislým vývojářem si můžeme představit člověka, který se při výskytu chyby v programu snaží chybu opravit nebo samostatně vyvíjí nové funkce. Těmto dvěma skupinám dává Git možnost mít u sebe celou kompletní historii projektu a snadné vytváření větví pak ulehčuje tvorbu oprav i práci na nových vlastnostech. A utilita git-svn umožní využití výhod Gitu i pro práci na projektech, které používají pro správu verzí systém Subversion.

Původně byl git-svn navržen jako nástroj pro obousměrné předávání sad změn mezi Gitem a Subversion pracující s jednou svn větví, ale vyvinul se do podoby, kdy je možné sledovat i modifikovat celou strukturu subversion repozitáře. Od toho se také odvíjí 2 scénáře, jak git-svn pužívat.

Začneme tím jednodušším, a to je sledování jedné větve Subversion

git svn clone svn://svn.danny.cz/libsql/trunk

čímž získáme kompletní historii větve trunk jako repozitář Gitu na lokálním počítači, větev trunk je možné nahradit za libovolnou jinou. A protože se přenáší celá historie dané větve, bude stahování nějakou dobu trvat. Strukturu lokální kopie nám ukáže

git branch -a
* master
  git-svn

kde master je lokální větev a git-svn je vzdálená, napojená na svn repozitář. Pokud potřebujeme aktualizovat naši kopii, spustíme příkaz

git svn rebase

, který získá aktualizace ze vzdáleného repozitáře a zároveň je aplikuje do pracovních souborů.

Teď už můžeme s repozitářem pracovat, jako když máme normální klon, kde je na druhé straně také Git. Časem ale vznikne potřeba odeslat naše lokální commity do vzdáleného svn repozitáře, a tak použijeme

git svn dcommit

Druhou a efektnější možností je sledování celého svn repozitáře a použijeme nedávno v Softwarové sklizni přestavený Misfit Model 3D

git svn clone --stdlayout http://svn.misfitcode.com/misfitcode/mm3d

, kde přepínač –stdlayout zařídí rozpoznání svn větví a tagů. Nyní je nutné obrnit se trpělivostí ještě více než v předchozím příkladě, protože se stahuje svn repozitář včetně kompletní historie a svn protokol není v tomto případě moc efektivní.

Nyní se můžeme podívat jak vypadá struktura

git branch -a
* master
  mm3d-qt4
  tags/mm3d-1.3.6
  tags/mm3d-1.3.7
  tags/mm3d-qt3-1.3.7
  trunk

, kde všechny větve kromě master jsou vzdálené.

Protože se ukázalo, že mm3d 1.3.7 nejde sestavit ve vývojové verzi Fedory, uděláme si lokální větev, kam budeme ukládat potřebné patche.

git checkout -b mm3d-1.3.7-fedora tags/mm3d-1.3.7

nyní se podíváme, co se změnilo

git branch -a
  master
* mm3d-1.3.7-fedora
  mm3d-qt4
  tags/mm3d-1.3.6
  tags/mm3d-1.3.7
  tags/mm3d-qt3-1.3.7
  trunk

Pro aktualizaci naší kopie z svn použijeme příkaz

git svn fetch

, což je ekvivalent příkazu „git fetch“, který aktualizuje všechny větve v lokálním repozitáři, ale nezasahuje do pracovních souborů. Pro jejich aktualizaci pak můžeme použít

bitcoin_skoleni

git rebase tags/mm3d-1.3.7 mm3d-1.3.7-fedora

Následovat bude „nezáživná“ práce na úpravě kódu, commit do lokálního repozitáře a pak vygenerování záplaty, kterou pošleme autorovi. A nebo, pokud máme právo zápisu do svn repozitáře, použijeme „git svn dcommit“.

Cílem tohoto článku nebyl detailní rozbor možností, které git-svn nabízí, k tomu lépe poslouží manuálová stránka a případně další dokumentace dostupná na webu, ale spíše ukázání postupů, které může použít správce balíčků nebo vývojář ve své každodenní práci. Za výhodu považuji i to, že svn repozitář se stáhne do přesně vymezených větví v lokální kopii, a tak nic nebrání v práci s lokálním git repozitářem používat své zaběhnuté postupy.