You are here

Add new comment

Error message

The spam filter installed on this site is currently unavailable. Per site policy, we are unable to accept new submissions until that problem is resolved. Please try resubmitting the form in a couple of minutes.

Subversion mergeinfo

Mergeinfo

Mergeinfo je verzovaná property svn:mergeinfo, obsahuje historii merge operací nad daným adresářem nebo souborem.

Explicitní mergeinfo

Když má cesta nastavenou mergeinfo property tak o této cestě říkáme, že má explicitní mergeinfo. Cestou se myslí adresář nebo soubor.

Subtree mergeinfo

Běžně je mergeinfo nastavené pouze na cíli merge operace. Subtree mergeinfo se objeví když:

  • cíl merge operace má subtree, který již byl dříve sám cílem merge operace (např. mergováním souboru z trunku do branche vytvoříme mergeinfo na tomto souboru).
  • se něco přejmenuje/přesune. Toto je považováno za nedostatek Subversion a možná bude odstraněno v budoucí verzi
  • se merguje s nekompletní reprezentací repository (mělká pracovní kopie, switchnuté subtree nebo když autorizační omezení nedovolí checkout na část stromu)

Merge bez modifikace mergeinfo

Několik případů, kdy nedojde k vytvoření nebo změně mergeinfo:

  • použití přepínače --ignore-ancestry
  • merge zdroj je z jiné repository než merge cíl
  • obrácený merge na změnu na stejné cestě (undo)

Dědičnost mergeinfo

Pokud cesta nemá explicitní mergeinfo používá mergeinfo svého rodiče/nadřazený adresář (nebo jeho prarodiče atd.) s explicitním mergeinfo. Koncept nejbližšího rodiče není omezen na pracovní kopii. Při zjišťování zděděného mergeinfo na cestě bez explicitního mergeinfo Subversion nejdříve prohlíží pracovní kopii směrem k jejímu kořenu. Pokud se dostane až ke kořenu pracovní kopie a stále nemůže najít explicitní mergeinfo, požádá repository o další prarodiče až ke kořeni celé repository. Pouze pokud nebyla nalezena žádná cesta s explicitním mergeinfo lze říci, že daná cesta nemá žádné (zděděné) mergeinfo. Pokud cesta dědí mergeinfo, dědí jen pouze z nejbližšího rodiče s explicitním mergeinfo.

Prázdné mergeinfo

Empty mergeinfo is a svn:mergeinfo property which has the empty string as a value. It simply means the state of this path is as if nothing was ever merged into it.

Prázdné mergeinfo je svn:mergeinfo property, která má prázdný řetezec jako svojí hodnotu. Tato hodnota znamená, že stav této testy je takový jako kdyby do ní nebylo nikdy nic zamergované.

Odstranění Mergeinfo

Na konci každé merge operace se Subversion pokusí "konsolidovat" přebývající subtree mergeinfo. Po dokončení merge operace Subversion prochází pracovní kopii merge cíle. Když nalezne cestu s explicitním mergeinfo. která má subtree se stejným explicitním mergeinfo, tak toto subtree mergeinfo odstraní.

Cyklický merge

Předpokládejme, že pracujete na kódu ve větvi, která bylo zkopírovaná z trunku. Během vývoje se pravidelně provádí merge na všechny nové změny z trunku takže větev je vždy synchronizovaná s prací v trunku. Když nakonec větev zamergujete do trunku, je tato operace nazvána cyklickým merge. Cyklický merge má tyto problémy:

  • když vyloučite revize, které byly mergované z trunku, tak také vyloučíte všechny změny, které byly provedeny za účelem vyřešení konfliktů jako součást merge operace. A navíc také hrozí, že mohly být komitnuty některé nesouvisející změny (občas se to povede) takže tyto změny budou též vyloučeny.
  • když zahrnete již synchronizované revize, tak když se provede merge zpět do trunku, budeme mergovat již existující změny. To vede na nepřehledný merge a konflikty.

Subversion již umí řešit cyklicé mergování. Jde o stejný typ merge operace existující již před verzí 1.5 a říká se mu 2-URL merge (Reintegrace)

Je třeba zdůraznit, že jakmile je větev reintegrovaná zpět, měla by být smazána z repository. Pokud je potřeba provést další změny, je třeba větev znovu vytvořit z nové kopie. Jsou pro to dva důvody:

  • jakmile zamergujete větev do trunku a později chcete synchronizovat změny z trunku zpět do větve, jste ve stejné situaci jako s cyklickým merge z větve!
  • když nemergujete změny z trunku do větve (viz předchocí bod), tak když se pokusíte znovu o reintegraci, Subversion bude mergovat vše znovu.

Reintegrace

Nový přepínač reintegrate je zkratka pro 2-URL merge s bezpečnostní kontrolou. Kontrola ověřuje, zda pracovní kopie obsahuje pouze jednu revizi, nemá žádné přepnuté potomky a nejde o "řídký" checkout (t.j. hloubka pracovní kopie je nekonečno). Nejvíce kontroverzí kontrola při reintegraci je ověření, že merge zdroj neobsahuje žádné subtree mergeinfo. Bez těchto kontrol je 2-URL merge náchylný na chyby jako je použití špatného URL nebo špatného čísla revize. Více informací o reintegraci můžete nalézt na Subversion merge reintegrate, část Reintegrate to the Rescue

Užitečné příkazy

Zjistit mergeinfo na celém stromu, XML formát je vhodný pro lepší čitelnost výstupu:
svn propget svn:mergeinfo --recursive --xml

Smazat mergeinfo na stromu kromě rootu (cíl merge operace)
svn propdel --recursive svn:mergeinfo ./*

Zdroje

Subversion merge reintegrate
Subversion 1.5 Mergeinfo - Understanding the Internals

Plain text

  • No HTML tags allowed.
  • Lines and paragraphs break automatically.