hgbook

annotate it/appA-svn.xml @ 841:1856c2f4835c

Final editing for chapters 12-14.
author gpiancastelli
date Fri Aug 21 23:01:58 2009 +0200 (2009-08-21)
parents 18905b63a904
children 7f827b71655b
rev   line source
Giulio@748 1 <appendix id="svn">
Giulio@749 2 <?dbhtml filename="migrare-verso-mercurial.html"?>
Giulio@748 3 <title>Migrare verso Mercurial</title>
Giulio@748 4
Giulio@752 5 <para id="x_6e1">Un modo comune di esplorare un nuovo strumento di controllo di revisione è quello di sperimentarlo trasferendo un progetto esistente piuttosto che cominciare un nuovo progetto da zero.</para>
Giulio@752 6
Giulio@752 7 <para id="x_6e2">In questa appendice, parleremo di come importare la cronologia di un progetto in Mercurial e di quello a cui dovete essere preparati se siete abituati a un sistema di controllo di revisione differente.</para>
Giulio@748 8
Giulio@748 9 <sect1>
Giulio@748 10 <title>Importare la cronologia da un altro sistema</title>
Giulio@748 11
Giulio@748 12 <para id="x_6e3">Mercurial include un'estensione chiamata <literal>convert</literal> che può importare la cronologia di un progetto dalla maggior parte dei sistemi di controllo di revisione più popolari. Al momento in cui il libro è stato scritto, l'estensione può importare la cronologia dai seguenti sistemi:</para>
Giulio@748 13 <itemizedlist>
Giulio@748 14 <listitem>
Giulio@748 15 <para id="x_6e4">Subversion</para>
Giulio@748 16 </listitem>
Giulio@748 17 <listitem>
Giulio@748 18 <para id="x_6e5">CVS</para>
Giulio@748 19 </listitem>
Giulio@748 20 <listitem>
Giulio@748 21 <para id="x_6e6">git</para>
Giulio@748 22 </listitem>
Giulio@748 23 <listitem>
Giulio@748 24 <para id="x_6e7">Darcs</para>
Giulio@748 25 </listitem>
Giulio@748 26 <listitem>
Giulio@748 27 <para id="x_6e8">Bazaar</para>
Giulio@748 28 </listitem>
Giulio@748 29 <listitem>
Giulio@748 30 <para id="x_6e9">Monotone</para>
Giulio@748 31 </listitem>
Giulio@748 32 <listitem>
Giulio@748 33 <para id="x_6ea">GNU Arch</para>
Giulio@748 34 </listitem>
Giulio@748 35 <listitem>
Giulio@748 36 <para id="x_6eb">Mercurial</para>
Giulio@748 37 </listitem>
Giulio@748 38 </itemizedlist>
Giulio@748 39
Giulio@752 40 <para id="x_6ec">(Per verificare perché lo stesso Mercurial sia supportato come sorgente da cui importare la cronologia, si veda la <xref linkend="svn.filemap"/>.)</para>
Giulio@752 41
Giulio@752 42 <para id="x_6ed">Potete attivare l'estensione nel solito modo, modificando il vostro file <filename>~/.hgrc</filename>.</para>
Giulio@748 43
Giulio@748 44 <programlisting>[extensions]
Giulio@748 45 convert =</programlisting>
Giulio@748 46
Giulio@752 47 <para id="x_6ee">Questo renderà disponibile il comando <command>hg convert</command>. Il comando è facile da usare. Per esempio, l'invocazione seguente importerà in Mercurial la cronologia di Subversion per Nose, un framework per il collaudo di unità.</para>
Giulio@748 48
Giulio@748 49 <screen><prompt>$</prompt> <userinput>hg convert http://python-nose.googlecode.com/svn/trunk</userinput></screen>
Giulio@748 50
Giulio@806 51 <para id="x_6ef">L'estensione <literal>convert</literal> opera in maniera incrementale. In altre parole, dopo che avete invocato <command>hg convert</command> una prima volta, invocandolo nuovamente importerete tutte le nuove revisioni che sono state inserite dopo la vostra prima esecuzione del comando. La conversione incrementale funzionerà solo se invocate <command>hg convert</command> nello stesso repository Mercurial che avete usato in origine, perché l'estensione <literal>convert</literal> salva alcuni metadati privati all'interno del repository in un file chiamato <filename>.hg/shamap</filename> non soggetto al controllo di revisione.</para>
Giulio@806 52
Giulio@806 53 <para id="x_707">Quando volete cominciare a effettuare modifiche usando Mercurial, è preferibile clonare l'albero in cui state facendo le vostre conversioni e tenere da parte l'albero originale per dedicarlo a future conversioni incrementali. Questo è il modo più sicuro per estrarre i futuri commit dal sistema di controllo di revisione sorgente e incorporarli nel progetto Mercurial che avete appena creato.</para>
Giulio@752 54
Giulio@752 55 <sect2>
Giulio@752 56 <title>Convertire molti rami</title>
Giulio@752 57
Giulio@813 58 <para id="x_708">Il comando <command>hg convert</command> eseguito in precedenza converte solo la cronologia del <literal>trunk</literal> del repository Subversion. Se invece usiamo l'URL <literal>http://python-nose.googlecode.com/svn</literal>, Mercurial individuerà automaticamente le directory <literal>trunk</literal>, <literal>tags</literal> e <literal>branches</literal> che compongono la struttura usata di solito dai progetti Subversion e le importerà come rami separati.</para>
Giulio@752 59
Giulio@752 60 <para id="x_709">Per default, a ogni ramo Subversion importato in Mercurial viene assegnato un nome. Dopo che la conversione si è conclusa, potete ottenere una lista dei nomi dei rami attivi nel repository Mercurial usando <command>hg branches -a</command>. Se preferite importare i rami Subversion senza nomi, passate l'opzione <option>--config convert.hg.usebranchnames=false</option> al comando <command>hg convert</command>.</para>
Giulio@752 61
Giulio@806 62 <para id="x_70a">Una volta che avete convertito il vostro albero, se volete seguire la consuetudine tipica per Mercurial di lavorare in un albero che contiene un singolo ramo, potete clonare quel singolo ramo usando <command>hg clone -r nomedelramo</command>.</para>
Giulio@748 63 </sect2>
Giulio@748 64
Giulio@748 65 <sect2>
Giulio@748 66 <title>Correlare i nomi utente</title>
Giulio@748 67
Giulio@806 68 <para id="x_6f0">Alcuni strumenti di controllo di revisione salvano con ogni inserimento solo nomi utenti brevi che possono essere difficili da interpretare. Con Mercurial, la norma è quella di salvare il nome e l'indirizzo email di chi effettua il commit, due informazioni molto più utili se in seguito volessimo contattare quella persona.</para>
Giulio@752 69
Giulio@752 70 <para id="x_6f1">Se state convertendo un albero da un sistema di controllo di revisione che usa nomi brevi, potete correlare quei nomi a equivalenti più lunghi passando l'opzione <option>--authors</option> al comando <command>hg convert</command>. Questa opzione accetta un nome di file che dovrebbe contenere voci nel seguente formato.</para>
Giulio@752 71
Giulio@752 72 <programlisting>arist = Aristotele &lt;aristotele@filo.example.gr&gt;
Giulio@752 73 soc = Socrate &lt;socrate@filo.example.gr&gt;</programlisting>
Giulio@752 74
Giulio@806 75 <para id="x_6f2">Ogni volta che <literal>convert</literal> incontra un commit associato al nome utente <literal>arist</literal> nel repository sorgente, userà il nome <literal>Aristotele &lt;aristotele@filo.example.gr&gt;</literal> nella revisione convertita in Mercurial. Se non viene trovata alcuna corrispondenza per un certo nome, quel nome viene usato alla lettera.</para>
Giulio@748 76 </sect2>
Giulio@748 77
Giulio@748 78 <sect2 id="svn.filemap">
Giulio@752 79 <title>Riordinare l'albero</title>
Giulio@752 80
Giulio@752 81 <para id="x_6f3">Non tutti i progetti hanno una cronologia pulita. Potrebbe esserci una directory che non avrebbe mai dovuto essere inserita, un file che è troppo grande, o un'intera gerarchia che ha bisogno di essere riorganizzata.</para>
Giulio@752 82
Giulio@752 83 <para id="x_6f4">L'estensione <literal>convert</literal> supporta l'idea di una <quote>mappa di file</quote> che può essere impiegata per riorganizzare i file e le directory di un progetto nel momento in cui se ne importa la cronologia. Questo è utile non solo quando si importa la cronologia da altri sistemi di controllo di revisione, ma anche per potare o riorganizzare un albero Mercurial.</para>
Giulio@748 84
Giulio@748 85 <para id="x_6f5">Per specificare una mappa di file, usate l'opzione <option>--filemap</option> e fornitele un nome di file. Una mappa di file contiene righe nei seguenti formati.</para>
Giulio@748 86
Giulio@748 87 <programlisting># Questo è un commento
Giulio@748 88 # Le righe vuote vengono ignorate
Giulio@748 89
Giulio@752 90 include percorso/del/file
Giulio@752 91
Giulio@752 92 exclude percorso/del/file
Giulio@752 93
Giulio@752 94 rename da/qualche/percorso a/qualche/altra/posizione
Giulio@748 95 </programlisting>
Giulio@748 96
Giulio@752 97 <para id="x_6f6">La direttiva <literal>include</literal> provoca l'inclusione di un file, o di tutti i file contenuti in una directory, nel repository destinazione. Questa direttiva provoca anche l'esclusione di tutti gli altri file o directory che non sono stati esplicitamente inclusi. La direttiva <literal>exclude</literal> provoca l'esclusione dei file e delle directory indicate e di tutti quegli altri percorsi che non sono stati esplicitamente menzionati per essere inclusi.</para>
Giulio@748 98
Giulio@748 99 <para id="x_6f7">Per spostare un file o una directory da una posizione a un'altra, usate la direttiva <literal>rename</literal>. Se dovete spostare un file o una directory da una sottodirectory alla radice del repository, usate <literal>.</literal> come secondo argomento della direttiva <literal>rename</literal>.</para>
Giulio@748 100 </sect2>
Giulio@748 101
Giulio@748 102 <sect2>
Giulio@748 103 <title>Migliorare le prestazioni della conversione da Subversion</title>
Giulio@748 104
Giulio@806 105 <para id="x_70b">Avrete spesso bisogno di fare diversi tentativi prima di trovare la combinazione perfetta tra mappa di utenti, mappa di file e altri parametri di conversione. La conversione di un repository Subversion attraverso un protocollo di accesso come ssh o HTTP può procedere migliaia di volte più lentamente di quanto Mercurial sia capace di operare in realtà, a causa della latenza di rete. Questo può rendere molto complicata la messa a punto di quella ricetta per la conversione perfetta.</para>
Giulio@806 106
Giulio@806 107 <para id="x_70c">Il comando <ulink url="http://svn.collab.net/repos/svn/trunk/notes/svnsync.txt"><command>svnsync</command></ulink> può velocizzare notevolmente la conversione di un repository Subversion. Serve per creare un mirror di sola lettura di un repository Subversion. L'idea è quella di creare un mirror locale del vostro albero Subversion per poi convertire il mirror in un repository Mercurial.</para>
Giulio@748 108
Giulio@748 109 <para id="x_70d">Immaginiamo di voler convertire il repository Subversion che contiene il popolare progetto Memcached in un albero Mercurial. Per prima cosa, creiamo un repository Subversion locale.</para>
Giulio@748 110
Giulio@748 111 <screen><prompt>$</prompt> <userinput>svnadmin create memcached-mirror</userinput></screen>
Giulio@748 112
Giulio@752 113 <para id="x_70e">Successivamente, impostiamo un hook Subversion di cui <command>svnsync</command> ha bisogno.</para>
Giulio@748 114
Giulio@748 115 <screen><prompt>$</prompt> <userinput>echo '#!/bin/sh' > memcached-mirror/hooks/pre-revprop-change</userinput>
Giulio@748 116 <prompt>$</prompt> <userinput>chmod +x memcached-mirror/hooks/pre-revprop-change</userinput></screen>
Giulio@748 117
Giulio@748 118 <para id="x_70f">Poi inizializziamo <command>svnsync</command> in questo repository.</para>
Giulio@748 119
Giulio@748 120 <screen><prompt>$</prompt> <userinput>svnsync --init file://`pwd`/memcached-mirror \
Giulio@748 121 http://code.sixapart.com/svn/memcached</userinput></screen>
Giulio@748 122
Giulio@752 123 <para id="x_710">Il passo successivo consiste nell'avviare il processo di creazione del mirror con il comando <command>svnsync</command>.</para>
Giulio@748 124
Giulio@748 125 <screen><prompt>$</prompt> <userinput>svnsync sync file://`pwd`/memcached-mirror</userinput></screen>
Giulio@748 126
Giulio@748 127 <para id="x_711">Infine, importiamo la cronologia del nostro mirror locale del repository Subversion in un repository Mercurial.</para>
Giulio@748 128
Giulio@748 129 <screen><prompt>$</prompt> <userinput>hg convert memcached-mirror</userinput></screen>
Giulio@748 130
Giulio@806 131 <para id="x_712">Se il repository Subversion è ancora attivo, possiamo usare questo processo in maniera incrementale. Invochiamo <command>svnsync</command> per propagare i nuovi cambiamenti verso il nostro mirror e poi invochiamo <command>hg convert</command> per importarli nel nostro albero Mercurial.</para>
Giulio@806 132
Giulio@806 133 <para id="x_713">Un'importazione in due stadi realizzata con <command>svnsync</command> ha due vantaggi. Il primo è che <command>svnsync</command> usa una sincronizzazione di rete con Subversion più efficiente rispetto al comando <command>hg convert</command>, quindi trasferisce meno dati attraverso la rete. Il secondo è che l'importazione da un albero Subversion locale è così veloce che potete aggiustare ripetutamente le vostre impostazioni di conversione senza aspettare ogni volta la terminazione di un processo di conversione basato su rete e dolorosamente lento.</para>
Giulio@748 134 </sect2>
Giulio@748 135 </sect1>
Giulio@748 136
Giulio@748 137 <sect1>
Giulio@748 138 <title>Migrare da Subversion</title>
Giulio@748 139
Giulio@752 140 <para id="x_6f8">Attualmente Subversion è il sistema di controllo di revisione open source più popolare. Sebbene ci siano molte differenze tra Mercurial e Subversion, effettuare una transizione da Subversion a Mercurial non è particolarmente difficile. I due sistemi hanno insiemi di comandi simili e interfacce generalmente uniformi.</para>
Giulio@748 141
Giulio@748 142 <sect2>
Giulio@748 143 <title>Differenze filosofiche</title>
Giulio@748 144
Giulio@748 145 <para id="x_6f9">Naturalmente, la differenza fondamentale tra Subversion e Mercurial è che Subversion è centralizzato mentre Mercurial è distribuito. Dato che Mercurial memorizza tutta la cronologia di un progetto sul vostro disco locale, ha bisogno di accedere alla rete solo quando volete esplicitamente comunicare con un altro repository. Al contrario, Subversion memorizza localmente un'esigua quantità di informazioni, perciò il client deve contattare il proprio server per molte operazioni comuni.</para>
Giulio@748 146
Giulio@752 147 <para id="x_6fa">Subversion riesce più o meno a cavarsela senza una nozione di ramo ben definita: qualificare come ramo una porzione dello spazio di nomi sul server è una questione di convenzioni, e il software non impone alcuna costrizione. Mercurial tratta un repository come l'unità della gestione dei rami.</para>
Giulio@748 148
Giulio@748 149 <sect3>
Giulio@748 150 <title>L'ambito dei comandi</title>
Giulio@748 151
Giulio@806 152 <para id="x_6fb">Dato che Subversion non sa quali parti del suo spazio di nomi siano realmente rami, tratta la maggior parte dei comandi come se richiedesse di operare al livello della directory in cui vi trovate e ai livelli sottostanti. Per esempio, se eseguite <command>svn log</command>, otterrete la cronologia di qualunque parte dell'albero stiate osservando, non dell'intero albero.</para>
Giulio@806 153
Giulio@806 154 <para id="x_6fc">Il comportamento predefinito di Mercurial è differente perché i suoi comandi operano sull'intero repository. Eseguite <command>hg log</command> e vi mostrerà la cronologia dell'intero albero, a prescindere da quale parte della directory di lavoro stiate visitando in quel momento. Se volete solo la cronologia di un file o di una directory particolare, vi basta fornire un nome al comando, e.g. <command>hg log sorgenti</command>.</para>
Giulio@752 155
Giulio@752 156 <para id="x_6fd">Secondo la mia esperienza, questa differenza nel comportamento predefinito dei comandi è probabilmente la cosa che può confondervi di più se dovete spostarvi frequentemente avanti e indietro tra i due strumenti.</para>
Giulio@748 157 </sect3>
Giulio@748 158
Giulio@748 159 <sect3>
Giulio@748 160 <title>Operazioni multi-utente e sicurezza</title>
Giulio@748 161
Giulio@752 162 <para id="x_6fe">Con Subversion, è normale (anche se blandamente deprecato) che più persone collaborino su un singolo ramo. Se Alice e Bruno stanno lavorando insieme e Alice inserisce alcune modifiche nel ramo condiviso, Bruno deve aggiornare la vista del ramo del suo client prima di poter effettuare un commit. Dato che in quel momento non esiste alcuna registrazione permanente dei cambiamenti fatti da Bruno, le sue modifiche potrebbero rovinarsi o andare perdute durante e dopo questo aggiornamento.</para>
Giulio@752 163
Giulio@806 164 <para id="x_6ff">Mercurial, invece, incoraggia un modello di inserimento-e-unione. Bruno inserisce le sue modifiche nella sua copia locale del repository prima di estrarre o trasmettere i cambiamenti da o verso il server che condivide con Alice. Se Alice trasmette i suoi cambiamenti prima che Bruno provi a trasmettere i propri, Bruno non sarà in grado di trasmettere i suoi cambiamenti prima di aver estratto quelli di Alice, averli incorporati e aver effettuato il commit dei risultati dell'unione. Se Bruno commette un errore durante l'unione, può sempre ritornare al commit con il quale aveva registrato i suoi cambiamenti.</para>
Giulio@806 165
Giulio@806 166 <para id="x_700">Vale la pena sottolineare che questi sono i modi più comuni di lavorare con questi strumenti. Subversion supporta un modello più sicuro per consentirvi di lavorare nel vostro ramo personale, che però in pratica si rivela abbastanza scomodo da non essere particolarmente diffuso. Mercurial può supportare un modello meno sicuro che permette di estrarre e unire i cambiamenti nonostante la presenza di modifiche non ancora registrate, ma questo è considerato estremamente inusuale.</para>
Giulio@748 167 </sect3>
Giulio@748 168
Giulio@748 169 <sect3>
Giulio@748 170 <title>Cambiamenti locali o pubblici</title>
Giulio@748 171
Giulio@748 172 <para id="x_701">Il comando <command>svn commit</command> pubblica immediatamente i cambiamenti su un server dove possono essere visti da chiunque abbia accesso in lettura.</para>
Giulio@748 173
Giulio@748 174 <para id="x_702">Con Mercurial, i commit sono sempre locali e devono essere pubblicati successivamente tramite il comando <command>hg push</command>.</para>
Giulio@748 175
Giulio@752 176 <para id="x_703">Ogni approccio ha i propri vantaggi e svantaggi. Il modello di Subversion prevede che i cambiamenti siano pubblicati, e quindi revisionabili e utilizzabili, immediatamente. D'altra parte, questo significa che un utente deve avere accesso in scrittura a un repository per utilizzare normalmente lo strumento, ma la maggior parte dei progetti open source non concede alla leggera i permessi di scrittura.</para>
Giulio@752 177
Giulio@752 178 <para id="x_704">L'approccio di Mercurial consente a chiunque possa clonare un repository di inserirvi modifiche senza il bisogno del permesso di qualcun altro e di pubblicare i propri cambiamenti e continuare a partecipare nel modo che preferisce. A causa della distinzione tra le operazioni di inserimento e trasmissione dei cambiamenti, può capitare che qualcuno effettui il commit di alcune modifiche sul proprio computer e si allontani per qualche giorno dimenticandosi di trasmetterli, cosa che in rari casi potrebbe bloccare temporaneamente le attività dei collaboratori.</para>
Giulio@748 179 </sect3>
Giulio@748 180 </sect2>
Giulio@748 181
Giulio@748 182 <sect2>
Giulio@752 183 <title>Guida rapida</title>
Giulio@748 184
Giulio@748 185 <table>
Giulio@748 186 <title>Equivalenze tra i comandi Subversion e Mercurial</title>
Giulio@748 187 <tgroup cols="3">
Giulio@748 188 <thead>
Giulio@748 189 <row>
Giulio@748 190 <entry>Subversion</entry>
Giulio@748 191 <entry>Mercurial</entry>
Giulio@748 192 <entry>Notes</entry>
Giulio@748 193 </row>
Giulio@748 194 </thead>
Giulio@748 195 <tbody>
Giulio@748 196 <row>
Giulio@748 197 <entry><command>svn add</command></entry>
Giulio@748 198 <entry><command>hg add</command></entry>
Giulio@748 199 <entry></entry>
Giulio@748 200 </row>
Giulio@748 201 <row>
Giulio@748 202 <entry><command>svn blame</command></entry>
Giulio@748 203 <entry><command>hg annotate</command></entry>
Giulio@748 204 <entry></entry>
Giulio@748 205 </row>
Giulio@748 206 <row>
Giulio@748 207 <entry><command>svn cat</command></entry>
Giulio@748 208 <entry><command>hg cat</command></entry>
Giulio@748 209 <entry></entry>
Giulio@748 210 </row>
Giulio@748 211 <row>
Giulio@748 212 <entry><command>svn checkout</command></entry>
Giulio@748 213 <entry><command>hg clone</command></entry>
Giulio@748 214 <entry></entry>
Giulio@748 215 </row>
Giulio@748 216 <row>
Giulio@748 217 <entry><command>svn cleanup</command></entry>
Giulio@748 218 <entry>n/a</entry>
Giulio@748 219 <entry>Nessuna pulizia necessaria</entry>
Giulio@748 220 </row>
Giulio@748 221 <row>
Giulio@748 222 <entry><command>svn commit</command></entry>
Giulio@748 223 <entry><command>hg commit</command>; <command>hg
Giulio@748 224 push</command></entry>
Giulio@748 225 <entry><command>hg push</command> pubblica le modifiche dopo il commit</entry>
Giulio@748 226 </row>
Giulio@748 227 <row>
Giulio@748 228 <entry><command>svn copy</command></entry>
Giulio@748 229 <entry><command>hg clone</command></entry>
Giulio@748 230 <entry>Per creare un nuovo ramo</entry>
Giulio@748 231 </row>
Giulio@748 232 <row>
Giulio@748 233 <entry><command>svn copy</command></entry>
Giulio@748 234 <entry><command>hg copy</command></entry>
Giulio@748 235 <entry>Per copiare file o directory</entry>
Giulio@748 236 </row>
Giulio@748 237 <row>
Giulio@748 238 <entry><command>svn delete</command> (<command>svn
Giulio@748 239 remove</command>)</entry>
Giulio@748 240 <entry><command>hg remove</command></entry>
Giulio@748 241 <entry></entry>
Giulio@748 242 </row>
Giulio@748 243 <row>
Giulio@748 244 <entry><command>svn diff</command></entry>
Giulio@748 245 <entry><command>hg diff</command></entry>
Giulio@748 246 <entry></entry>
Giulio@748 247 </row>
Giulio@748 248 <row>
Giulio@748 249 <entry><command>svn export</command></entry>
Giulio@748 250 <entry><command>hg archive</command></entry>
Giulio@748 251 <entry></entry>
Giulio@748 252 </row>
Giulio@748 253 <row>
Giulio@748 254 <entry><command>svn help</command></entry>
Giulio@748 255 <entry><command>hg help</command></entry>
Giulio@748 256 <entry></entry>
Giulio@748 257 </row>
Giulio@748 258 <row>
Giulio@748 259 <entry><command>svn import</command></entry>
Giulio@748 260 <entry><command>hg addremove</command>; <command>hg
Giulio@748 261 commit</command></entry>
Giulio@748 262 <entry></entry>
Giulio@748 263 </row>
Giulio@748 264 <row>
Giulio@748 265 <entry><command>svn info</command></entry>
Giulio@748 266 <entry><command>hg parents</command></entry>
Giulio@748 267 <entry>Mostra quale revisione è stata estratta</entry>
Giulio@748 268 </row>
Giulio@748 269 <row>
Giulio@748 270 <entry><command>svn info</command></entry>
Giulio@748 271 <entry><command>hg showconfig
Giulio@748 272 paths.parent</command></entry>
Giulio@752 273 <entry>Mostra da quale URL è avvenuta l'estrazione</entry>
Giulio@748 274 </row>
Giulio@748 275 <row>
Giulio@748 276 <entry><command>svn list</command></entry>
Giulio@748 277 <entry><command>hg manifest</command></entry>
Giulio@748 278 <entry></entry>
Giulio@748 279 </row>
Giulio@748 280 <row>
Giulio@748 281 <entry><command>svn log</command></entry>
Giulio@748 282 <entry><command>hg log</command></entry>
Giulio@748 283 <entry></entry>
Giulio@748 284 </row>
Giulio@748 285 <row>
Giulio@748 286 <entry><command>svn merge</command></entry>
Giulio@748 287 <entry><command>hg merge</command></entry>
Giulio@748 288 <entry></entry>
Giulio@748 289 </row>
Giulio@748 290 <row>
Giulio@748 291 <entry><command>svn mkdir</command></entry>
Giulio@748 292 <entry>n/a</entry>
Giulio@748 293 <entry>Mercurial non tiene traccia delle directory</entry>
Giulio@748 294 </row>
Giulio@748 295 <row>
Giulio@748 296 <entry><command>svn move</command> (<command>svn
Giulio@748 297 rename</command>)</entry>
Giulio@748 298 <entry><command>hg rename</command></entry>
Giulio@748 299 <entry></entry>
Giulio@748 300 </row>
Giulio@748 301 <row>
Giulio@748 302 <entry><command>svn resolved</command></entry>
Giulio@748 303 <entry><command>hg resolve -m</command></entry>
Giulio@748 304 <entry></entry>
Giulio@748 305 </row>
Giulio@748 306 <row>
Giulio@748 307 <entry><command>svn revert</command></entry>
Giulio@748 308 <entry><command>hg revert</command></entry>
Giulio@748 309 <entry></entry>
Giulio@748 310 </row>
Giulio@748 311 <row>
Giulio@748 312 <entry><command>svn status</command></entry>
Giulio@748 313 <entry><command>hg status</command></entry>
Giulio@748 314 <entry></entry>
Giulio@748 315 </row>
Giulio@748 316 <row>
Giulio@748 317 <entry><command>svn update</command></entry>
Giulio@748 318 <entry><command>hg pull -u</command></entry>
Giulio@748 319 <entry></entry>
Giulio@748 320 </row>
Giulio@748 321 </tbody>
Giulio@748 322 </tgroup>
Giulio@748 323 </table>
Giulio@748 324 </sect2>
Giulio@748 325 </sect1>
Giulio@748 326
Giulio@748 327 <sect1>
Giulio@748 328 <title>Suggerimenti utili per i principianti</title>
Giulio@748 329
Giulio@806 330 <para id="x_705">In alcuni sistemi di controllo di revisione, può diventare complicato stampare le differenze per una singola revisione registrata nel repository. Per esempio, con Subversion, per vedere cos'è cambiato nella revisione 104654 dovete digitare <command>svn diff -r104653:104654</command>. Mercurial elimina la necessità di digitare due volte l'identificatore di revisione in questo caso comune. Per ottenere solo le differenze, digitate <command>hg export 104654</command>. Per ottenere un messaggio dal registro della cronologia seguito dalle differenze, digitate <command>hg log -r104654 -p</command>.</para>
Giulio@752 331
Giulio@752 332 <para id="x_706">Quando eseguite <command>hg status</command> senza argomenti, vi viene mostrato lo stato dell'intero albero, con i percorsi relativi alla radice del repository. Questo rende complicato copiare un nome di file dal risultato di <command>hg status</command> alla riga di comando. Se eseguite <command>hg status</command> passandogli il nome di un file o di una directory, il comando stamperà i percorsi relativi alla vostra posizione corrente. Quindi, per ottenere da <command>hg status</command> lo stato di tutto l'albero, con i percorsi relativi alla vostra directory corrente invece che alla radice del repository, passate il risultato di <command>hg root</command> al comando <command>hg status</command>. Su un sistema di tipo Unix, potete farlo facilmente nel modo che segue:</para>
Giulio@748 333
Giulio@748 334 <screen><prompt>$</prompt> <userinput>hg status `hg root`</userinput></screen>
Giulio@748 335 </sect1>
Giulio@748 336 </appendix>