Mercurial per principianti: la guida pratica definitiva

Ispirato da Git per i principianti: la guida pratica definitiva .

Questa è una raccolta di informazioni sull’uso di Mercurial per i principianti per l’ uso pratico .

Principiante – un programmatore che ha toccato il controllo del codice sorgente senza comprenderlo molto bene.

Pratico: copre situazioni che la maggior parte degli utenti spesso incontra: creare un repository, ramificarsi, unire, tirare / spingere da / verso un repository remoto, ecc.

Note :

  • Spiega come ottenere qualcosa, piuttosto che come viene implementato qualcosa.
  • Gestire una domanda per risposta.
  • Rispondere in modo chiaro e il più conciso ansible.
  • Modifica / estendi una risposta esistente piuttosto che creare una nuova risposta sullo stesso argomento.
  • Si prega di fornire un link al Mercurial wiki o al HG Book per le persone che vogliono saperne di più.

Domande:

Installazione / Configurazione

  • Come installare Mercurial?
  • Come impostare Mercurial?
  • Come crei un nuovo progetto / repository?
  • Come lo configuri per ignorare i file?

Lavorare con il codice

  • Come si ottiene l’ultimo codice?
  • Come si controlla il codice?
  • Come commetti i cambiamenti?
  • Come vedi ciò che è uncommitted, o lo stato della tua base di codice attuale?
  • Come rimuovi i file dal repository?
  • Come distruggete i commit indesiderati?
  • Come confronti due revisioni di un file, o il tuo file attuale e una revisione precedente?
  • Come vedi la cronologia delle revisioni in un file o repository?
  • Come gestite i file binari (visio docs, ad esempio, o ambienti del compilatore)?
  • Come si uniscono i file modificati nello “stesso tempo”?
  • Come si ripristina un changeset?
  • Come si torna a una versione precedente del codice?
  • Come si estrae una patch da un changeset specifico?
  • Come si registra che è stato rinominato o cancellato un file senza utilizzare il comando Mercurial?

Tagging, branching, releases, baseline

  • Come si fa a “contrassegnare” il “tag” o “rilasciare” un particolare insieme di revisioni per un particolare set di file, in modo da poterlo sempre ritirare in seguito?
  • Come si tira un particolare “rilascio”?
  • Come si diramano?
  • Come si uniscono i rami?
  • Come si uniscono parti di un ramo in un altro ramo?

Altro

  • Buon plugin GUI / IDE per Mercurial? Vantaggi e svantaggi?
  • Qualche altro compito comune che un principiante dovrebbe conoscere?
  • Come faccio a interfacciarlo con Subversion?

Altri riferimenti Mercurial

  • Mercurial: la guida definitiva
  • Wiki Mercurial
  • Incontra Mercurial | Screencast Peepcode
  • Padroneggiare Mercurial | TekPub Screencast
  • Hg Init – Tutorial di Mercurial “ground-up”

Come lo configuri per ignorare i file?

Ignora è configurato in un normale file di testo chiamato .hgignore nella root del tuo repository. Aggiungilo come un normale file con:

hg add .hgignore 

Sono disponibili due opzioni di syntax per la corrispondenza dei file, glob e regexp. glob è un’espansione del nome unix e regexp è un’espressione regolare. Si triggers ognuno aggiungendo la syntax: glob o syntax: regexp su una riga da solo. Tutte le righe successive useranno quella syntax, fino al prossimo marcatore di syntax. Puoi avere tanti marcatori di syntax quanti vuoi. La syntax predefinita è regexp, quindi se usi solo regexp non hai bisogno di alcun marcatore di syntax.

Puoi aggiungere commenti con #

Esempio:

 # python temporary files syntax: glob *.pyc #editor autosaves *~ # temporary data syntax: regexp temp 

Ignora si applica solo ai file non gestiti (cioè file che non sono già registrati). Per ignorare i file che sono sotto controllo di versione, è ansible utilizzare gli switch -I e -X.

Come vedi ciò che è uncommitted, o lo stato della tua base di codice attuale?

Per visualizzare un elenco di file che sono stati modificati:

 $ hg status 

Questo stamperà ogni file che è stato modificato insieme al suo stato, che può includere:

  • M – Modificato. Il file è stato modificato e le modifiche non sono state confermate.
  • A – Aggiunto. Il file non è stato tracciato prima, ma se si commette Mercurial inizierà a seguirlo.
  • R – Rimosso. Il file è stato rintracciato prima, ma se si commette Mercurial cesserà di seguirlo in questo e in futuri commit.
  • ? – sconosciuto. Il file non è attualmente monitorato da Mercurial. Il commit non avrà alcun effetto su di esso a meno che non si usi hg add per aggiungerlo.
  • ! – Manca. Il file è stato rintracciato ma Mercurial non riesce a trovarlo nella copia di lavoro.

Per vedere le modifiche che sono state effettivamente apportate ai file:

 $ hg diff 

Come crei un nuovo progetto / repository?

 $ hg init my-repository 

Come faccio a interfacciarlo con Subversion?

Ci sono tre modi:


L’ estensione convert clonerà un repository Subversion esistente in uno Mercurial. Viene fornito con Mercurial. Funziona all’incirca in questo modo:

 hg convert   

Ad esempio questo prenderà il trunk del repository memcached di SixApart.

 hg convert http://code.sixapart.com/svn/memcached/trunk 

L’estensione può introdurre in modo incrementale nuove revisioni da un repository Subversion in Mercurial (un po ‘come pull). Tuttavia non supporta l’assunzione di revisioni Mercurial e il loro invio a Subversion (nessuna spinta). [XXX: correggi questo se è sbagliato] .


L’ estensione hgsubversion . È in molti modi la soluzione più sofisticata in quanto utilizza l’API Subversion per comunicare con il repository Subversion. Mira a diventare il ponte hg-svn. Permette di eseguire il round-trip completo delle revisioni (clone completo, pull e push), tuttavia al momento della stesura [XXX: modifica questo se / quando diventa errato] è ancora in sviluppo e non ci sono ancora versioni ufficiali. Di conseguenza funziona solo con il Mercurial più aggiornato (1.3 al momento della stesura di questo documento).

  • Mappa tag e rami (precede tutti i tag con tags/ per distinguerli da rami con nome equivalente).
  • Mantiene un ramo speciale rami closed-branches per la chiusura dei rami che vengono rimossi in Subversion.
  • Richiede che il repository Subversion sia strutturato secondo la convenzione di trunk / branches / tags.
  • Il set di comandi è in genere hg svn sebbene miri ad essere integrato al punto che non è necessario la parte ‘svn’ (cioè vuole trattare un clone di Subversion il più ansible come qualsiasi altro repository Mercurial). ;

Funziona così:

clone:

 hg svnclone  

OR (solo per svn:// URL)

 hg clone  

Tirare:

 hg svn pull 

spingere:

 hg svn push 

in arrivo:

 hg svn incoming 

estroverso:

 hg svn outgoing 

Controllo di un intero repository:

 hg svnclone http://code.sixapart.com/svn/memcached 

L’utilità hgsvn ( albero di bitbucket ). Fino a poco tempo fa questo ti permetteva di clonare e tirare un repository Subversion, ma a partire da hgsvn 0.1.7 supporta push. [Non so quanto bene spinga. Chiunque abbia più esperienza dovrebbe aggiornarlo.] Ha le seguenti caratteristiche notevoli:

  • Genera un tag Mercurial per ogni tag SVN.
  • Mette un tag locale su ogni changeset per contrassegnare la sua revisione SVN.
  • Mette ogni revisione Mercurial su un ramo denominato che prende il nome dal suo ramo SVN. Per esempio branches/some-feature sarebbero come hg branch some-feature . Mette il trunk sul trunk (cioè nulla è nel ramo di default di Mercurial, a meno che l’utente non acceda esplicitamente ad esso).
  • Cercherà di identificare i rami e i tag e di crearli, ma se non può semplicemente li salta. Questo è utile quando il repository Subversion non sta seguendo il tradizionale layout trunk / branches / tags.

Funziona così:

clone:

 hgimportsvn  

Tirare:

 hgpullsvn 

spingere:

 hgpushsvn 

in arrivo:

 hgpullsvn -n 

estroverso:

 hgpushsvn -n 

Controllo di un intero repository:

 hgimportsvn http://code.sixapart.com/svn/memcached 

Controllando solo il bagagliaio:

 hgimportsvn http://code.sixapart.com/svn/memcached/trunk 

Come confronti due revisioni di un file, o il tuo file attuale e una revisione precedente?

Entrambi usano hg diff . Quando hg diff viene utilizzato tutte le modifiche nella copia di lavoro e viene visualizzato il suggerimento (l’ultimo commit).

Per “Come confronti due revisioni di un file?”

 $ hg diff -r{rev1} -r{rev2} {file.code} 

Il comando sopra mostrerà diversi tra rev1 e rev2 di “file.code”.

Per “Come confronti il ​​tuo file attuale e una revisione precedente?”

 $ hg diff {file.code} 

Il comando precedente mostrerà diversi tra la versione corrente di “file.code” e la versione più recente (l’ultima eseguita).

: D

Come si fa a “contrassegnare” il “tag” o “rilasciare” un particolare insieme di revisioni per un particolare set di file, in modo da poterlo sempre ritirare in seguito?

 $ hg tag my-tag 

Puoi anche clonare il tuo repository per creare un repository di tag speciale.

 $ hg clone working-repository my-tag-repository 

Come si diramano?

$ hg branch my-branch

o

$ hg clone original-repository my-branch

Sebbene si debba notare che il ramo crea una directory “virtuale” (cioè, i file rimangono gli stessi, ma hg li tratta come se fossero diversi all’interno del sistema), mentre il clone crea una copia completa e reale. A rigor di termini, il clone non si ramifica.

Buon plugin GUI / IDE per Mercurial?

GUI

  • TortoiseHg per quasi tutti i sistemi operativi. Include l’integrazione di Windows Explorer. Funziona anche su Linux e su alcuni altri SO: es. Max OS X. Ha un’interfaccia piuttosto goffo ed è un po ‘awkard da usare all’inizio, ma è molto completo e potente.
  • Corse oscure su Mac OS X 10.5 o versioni successive. Murky è utile per esplorare il repository e i comandi di base, ma dovrai anche sapere come usare la riga di comando.
  • MacHg è un simpatico Mac OS X Gui che ha un po ‘più di funzionalità e lucidatura di Murky, ma avrai comunque bisogno anche della riga di comando.
  • SourceTree è un client Mac originariamente, con una versione di Windows disponibile solo di recente. Interfaccia utente abbastanza carina (almeno su OS X), supporta la maggior parte delle funzionalità di Hg, incluso shelve.

plugin

  • VisualHG per Visual Studio
  • HgSccPackage per Visual Studio 2008/2010
  • MercurialEclipse per Eclipse
  • Supporto mercuriale per NetBeans
  • Supporto mercuriale per il testo sublime

Come commetti i cambiamenti?

Richiama questo comando dall’archivio locale locale * mercurial

 hg commit [OPTION]... [FILE]... 

alias: ci

  • Un repository mercurial locale ha .hg all’interno della directory corrente

Dove l’opzione può essere:

  -A --addremove mark new/missing files as added/removed before committing --close-branch mark a branch as closed, hiding it from the branch list -I --include include names matching the given patterns -X --exclude exclude names matching the given patterns -m --message use  as commit message -l --logfile read commit message from  -d --date record datecode as commit date -u --user record user as committer 

Un comando di esempio potrebbe essere:

 hg commit -m "added readme" README 

NOTE :

  • Se viene omesso un elenco di file, verranno confermate tutte le modifiche segnalate da “hg status”.
  • Se si sta eseguendo il commit di un’unione, non fornire alcun nome file o filtri -I / -X.
  • Se non viene specificato alcun messaggio di commit, viene avviato l’editor configurato per richiedere un messaggio.

Come impostare Mercurial?

Mercurial memorizza le informazioni di configurazione in ~/.hgrc su sistemi * nix e in %UserProfile%\mercurial.ini su sistemi Windows. ( %UserProfile% è in genere "C:\Documents and Settings\[username]\" su sistemi Windows 2000 o Windows XP e in genere C:\Users\[username]\ su sistemi Windows Vista e Windows 7.)

Come punto di partenza, dovresti impostare il tuo nome utente Mercurial inserendo quanto segue nel tuo .hgrc o mercurial.ini :

 # This is a Mercurial configuration file. [ui] username = Firstname Lastname  

In alternativa, gli utenti di TortoiseHg su sistemi Windows possono eseguire hgtk userconfig

Vedi anche ” Creazione di un file di configurazione Mercurial ” nel capitolo 2 di ” Mercurial: The Definitive Guide “.

Come si uniscono i rami?

 $ cd repository-where-i-want-to merge $ hg pull branch-i-want-to-merge $ hg merge # if necessary 

Come installare Mercurial?

Si prega di modificare bene se è stato installato dal sorgente su Linux, o utilizzato i programmi di installazione di Windows.

Mac OS X 10.4 (Tiger), 10.5 (Leopard)

Usa l’ installazione di easy di Python (con Setuptools ):

 sudo easy_install mercurial 

Questo trova l’ultima versione (1.3.1 al momento della scrittura) e si installa su:

 /Library/Frameworks/Python.framework/Versions/2.6/bin/ 

Con Python 2.6 si ottiene anche il pacchetto di installazione di Mercurial OS X (alla 1.2.1 del 26 luglio 2009) che lamenta la necessità di Python 2.5. Dalla documentazione , sembra che Fink e Macports installino la versione 1.2.

Linux

La maggior parte dei pacchetti Linux espliciti sembra essere in ritardo rispetto alla versione corrente, quindi usa easy_install (come sopra) o scarica il tarball Mercurial , estrai l’archivio, passa alla directory mercurial ed esegui:

 $ make $ sudo make install # do a system-wide install $ hg debuginstall # sanity check $ hg # see help 

(dall’introduzione di Mercurial, un sistema di controllo della versione distribuito )

windows

C’è un pacchetto binario dell’ultima versione di Mercurial . TortoiseHg è un’estensione della shell di Windows per, e installa, Mercurial. Cygwin può anche installare Mercurial.

In alternativa (istruzioni troppo lunghe così collegate qui), puoi build una versione Python ottimizzata o pura di Mercurial dal sorgente.

Come si ottiene l’ultimo codice?

Mercurial ricorda dove è stato clonato un repository da (in .hg / hgrc) in modo da poter eseguire semplicemente:

 hg pull 

per estrarre l’ultimo codice dal repository di origine. (Questo non aggiorna la directory di lavoro)

 hg update 

per aggiornare la directory di lavoro.

 hg pull -u 

per eseguire sia un pull che un aggiornamento contemporaneamente.

Come si controlla il codice?

 hg clone [OPTION]... SOURCE [DEST] 

Dove l’opzione può essere:

  -U --noupdate the clone will only contain a repository (no working copy) -r --rev a changeset you would like to have after cloning --pull use pull protocol to copy metadata --uncompressed use uncompressed transfer (fast over LAN) -e --ssh specify ssh command to use --remotecmd specify hg command to run on the remote side 

Dove l’origine è l’origine dei file originali situati nel repository, dove può essere un URL remoto o una directory del file system. Per esempio:

E la destinazione è dove il codice sorgente si troverà nel tuo filesystem locale.

Come commetti i cambiamenti?

 $ hg commit -m "Commit message" 

Come vedi quali modifiche verranno inviate al repository upstream quando premi?

Utilizzare hg outgoing per ottenere l’elenco dei changeset che verranno impostati sul repository predefinito:

 $ hg outgoing 

Per ottenere le effettive modifiche al codice, utilizzare -p ( --patch ). Questo produrrà in output ogni changeset per intero:

 $ hg outgoing -p 

Come si rimuove un file dal repository?

Per rimuovere un file dal repository e averlo eliminato sul prossimo commit:

 $ hg remove {file(s)} 

Per rimuovere un file dal repository, ma non averlo eliminato

 $ hg remove -Af {file(s)} 

o da Mercurial 1.3

 $ hg forget {file(s)} 

Come si torna a una versione precedente del codice?

Da questa domanda

 $ hg update [-r REV] 

@van: se in seguito ti impegni, creerai in modo efficace un nuovo ramo. Quindi potresti continuare a lavorare solo su questo ramo o eventualmente unire quello esistente in esso.

Come si ripristina un changeset?

Un paio di opzioni disponibili

Easy Way (backout un singolo set di modifiche)

 $ hg backout -m 'back out second change' tip reverting myfile changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a $ cat myfile first change 

Hard Way (manualmente diff e applicare)

Passaggio 1 : creare un file di correzione per ripristinare ciò che è cambiato tra la revisione 107 e 108:

 hg diff -r107 -r108 --reverse > revert-change.patch 

(in alternativa, hg diff -r108 -r107 con no –reverse farà la stessa cosa)

Passaggio 2 : applica il file di correzione:

 patch -p1 < revert-change.patch 

Alcuni dei diff possono non riuscire ad applicare, ad esempio:

 Hunk #3 FAILED at 517. 1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej' 

Il file .rej conterrà il contenuto del diff che non è stato applicato, è necessario dare un'occhiata.

Come vedi la cronologia delle revisioni in un file o repository?

Per mostrare la cronologia delle revisioni di interi repository o file

 $ hg log {file(s)} 

o

 $ hg history {file(s)} 

E per vedere la lista in ordine inverso

 $ hg log -r: 

Come si uniscono parti di un ramo in un altro ramo?

Abilita l’estensione ‘trapianto’ nel tuo .hg / hgrc

 [extensions] transplant= 

Carica il ramo bersaglio quindi trapianti la revisione del bersaglio.
Ad esempio: cherry pick revisione 81 dal ramo ‘pippo’ nel ramo corrente

 $ hg transplant -b foo 81 

Come si estrae una patch da un changeset specifico?

 $ hg export -o patchfile changeset 

Puoi quindi importarlo in un altro ramo con:

 $ hg import patchfile