Mercurial per principianti: la guida pratica definitiva


237

Ispirato da Git per principianti: la guida pratica definitiva .

Questa è una raccolta di informazioni sull'uso di Mercurial per principianti per uso pratico .

Principiante: un programmatore che ha toccato il controllo del codice sorgente senza capirlo molto bene.

Pratico - che copre situazioni che la maggior parte degli utenti incontra spesso - creazione di un repository, diramazione, fusione, pull / push da / verso un repository remoto, ecc.

Note :

  • Spiega come fare qualcosa piuttosto che come viene implementato qualcosa.
  • Gestisci una domanda per risposta.
  • Rispondi in modo chiaro e il più conciso possibile.
  • Modifica / estendi una risposta esistente anziché creare una nuova risposta sullo stesso argomento.
  • Fornisci un link al wiki Mercurial o al libro HG per le persone che vogliono saperne di più.

Domande:

Installazione / Configurazione

Lavorare con il codice

Tagging, branching, release, baseline

Altro

Altri riferimenti mercuriali

Risposte:


16

Come si configura per ignorare i file?

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

hg add .hgignore

Sono disponibili due opzioni di sintassi per la corrispondenza dei file, glob e regexp. glob è l'espansione del nome file unix e regexp è espressioni regolari. Si attiva ciascuno aggiungendo syntax: globo syntax: regexpsu una riga da solo. Tutte le righe seguenti che useranno quella sintassi, fino al successivo marker di sintassi. Puoi avere tutti gli indicatori di sintassi che desideri. La sintassi predefinita è regexp, quindi se si utilizza solo regexp non è necessario alcun marker di sintassi.

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 (ovvero file che non sono già stati archiviati). Per ignorare i file che sono sotto il controllo della versione, è possibile utilizzare le opzioni -I e -X.


7
Potrebbe essere utile menzionare che se i hg addfile vengono ignorati manualmente , Mercurial li seguirà. Ad esempio, se si dispone di un gruppo di file, come deploy-test.conf, deploy-production.conf, ecc e non vogliono loro versione (che potrebbero avere le password in loro), ma si fare desidera versione deploy-template.confsi può semplicemente ignorare deploy*e aggiungere manualmente deploy-templace.conf.
Steve Losh,

7

Come vedi cosa non è stato eseguito il commit o lo stato della tua base di codice corrente?

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à il monitoraggio.
  • R- Rimosso. Il file è stato tracciato in precedenza, ma se commetti Mercurial cesserà di rintracciarlo in questo e in futuro commit.
  • ?- Sconosciuto. Il file non è attualmente monitorato da Mercurial. Il commit non avrà alcun effetto su di esso a meno che non venga utilizzato hg addper 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

6

Come si crea un nuovo progetto / repository?

$ hg init my-repository

5

Come si interfaccia con Subversion?

Ci sono tre modi:


L' estensione di conversione clonerà un repository Subversion esistente in uno di Mercurial. Viene fornito con Mercurial. Funziona più o meno così:

hg convert <Subversion URL or directory> <path to new Mercurial repository>

Ad esempio, questo afferrerà il trunk del repository memCached SixApart.

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

L'estensione può portare in modo incrementale nuove revisioni da un repository Subversion a quello Mercurial (un po 'come pull). Tuttavia, non supporta l'acquisizione di revisioni Mercurial e il loro invio a Subversion (nessuna spinta). [XXX: correggilo 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 il pieno round-trip delle revisioni (clone completo, pull e push), tuttavia al momento in cui scrivo [XXX: modifica questo se / quando diventa errato] è ancora in fase di 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 (precedendo tutti i tag con tags/per distinguerli dai rami con nomi equivalenti).
  • Mantiene un ramo speciale closed-branchesper chiudere i rami che vengono rimossi in Subversion.
  • Si richiede che il Subversion repository essere disposti secondo la convenzione di tronco / rami / tag.
  • Il set di comandi è in genere hg svn <subcommand>anche se mira a essere integrato al punto che non è necessaria la parte 'svn' (cioè vuole trattare un clone Subversion il più possibile come qualsiasi altro repository Mercurial) .;

Funziona così:

clone:

hg svnclone <Subversion URL> 

OPPURE (solo per svn://URL)

hg clone <svn:// URL>

Tirare:

hg svn pull

spingere:

hg svn push

in arrivo:

hg svn incoming

estroverso:

hg svn outgoing

Verifica di un intero repository:

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

L' utilità hgsvn ( albero bitbucket ). Fino a poco tempo fa questo ti consentiva solo di clonare ed estrarre un repository Subversion, ma al hgsvn 0.1.7momento supporta push. [Non so quanto bene lo fa spingere. Chiunque abbia più esperienza dovrebbe aggiornare questo.] Ha le seguenti caratteristiche notevoli:

  • Genera un tag Mercurial per ogni tag SVN.
  • Inserisce un tag locale su ogni changeset per contrassegnare la sua revisione SVN.
  • Pone ogni revisione di Mercurial su un ramo denominato che prende il nome dal suo ramo SVN. Ad esempio branches/some-featuresarebbe come hg branch some-feature. Inserisce il trunk trunk(ovvero nulla si trova sul ramo predefinito Mercurial, a meno che l'utente non lo passi esplicitamente).
  • Tenterà di identificare rami e tag e di crearli, ma se non ci riesce li salterà. Ciò è utile quando il repository Subversion non sta seguendo il layout convenzionale trunk / rami / tag.

Funziona così:

clone:

hgimportsvn <Subversion URL>

Tirare:

hgpullsvn

spingere:

hgpushsvn

in arrivo:

hgpullsvn -n

estroverso:

hgpushsvn -n

Verifica di un intero repository:

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

Verifica solo il bagagliaio:

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

2
Ho appena usato hg converte ci vuole davvero molto tempo quando hai un repository svn con molte commit. Configurare un repository locale con svnsyncaiuta a velocizzare molto le cose, specialmente quando è necessario farlo più volte, perché nel comando convert c'erano alcune opzioni sbagliate.
Debilski,

Penso che tutti questi metodi siano più veloci se si dispone di una copia locale del repository SVN. Ma non puoi sempre accedere al repository completo giusto? Ho pensato che svnsyncdovesse accedere ai file effettivi del repository, non solo all'URL.
quark

Si noti che hgsvn è ora in modalità manutenzione , quindi non viene più sviluppato attivamente. Raccomandano invece di usare hgsubversion.
Jon L.

5

Come si confrontano due revisioni di un file o il file corrente e una revisione precedente?

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

Per "Come si confrontano due revisioni di un file?"

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

Il comando sopra mostrerà differenti tra rev1 e rev2 di "file.code".

Per "Come si confrontano il file corrente e una revisione precedente?"

$ hg diff {file.code}

Il comando precedente mostrerà una differenza tra la versione corrente di "file.code" e la revisione più recente (l'ultima memorizzata).

: D


4

Come si fa a "contrassegnare" "tag" o "rilasciare" un determinato insieme di revisioni per un particolare insieme di file in modo da poterlo estrarre 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

3
Perché no hg tag my-tag?
Steve Losh,

4

Come si ramifica?

$ hg branch my-branch

o

$ hg clone repository originale my-branch

Anche se va notato che branch 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 effettiva e completa. A rigor di termini, il clone non si ramifica.


4
Questo è il modo più pesante che le persone git prendono sempre in giro le persone di Mercurial per raccomandare. Un modo più leggero e familiare per i principianti sarebbehg branch my-branch
Steve Losh,

8
È necessario notare che si tratta di due operazioni completamente diverse.
stepancheg,

2
Ho trovato questa guida che potrebbe essere utile per la ramificazione in Mercurial: stevelosh.com/blog/2009/08/a-guide-to-branching-in- mercurial
mbillard

Per i rami leggeri in hg che non sono permanenti (come il ramo hg) usa l'estensione dei segnalibri mercuriali
hultqvist

L'articolo collegato da GoodEnough fornisce un altro metodo leggero usando i segnalibri. Sembra abbastanza buono per i cambiamenti che non sono significativi per meritare il proprio ramo
Casebash,

4

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 un po 'goffa ed è un po' difficile da usare all'inizio, ma è molto completo e potente.
  • Murky funziona su Mac OS X 10.5 o successivo. Murky è utile per esplorare il repository e i comandi di base, ma dovrai anche sapere come utilizzare la riga di comando.
  • MacHg è un bel Mac OS X Gui che ha un po 'più di funzionalità e lucentezza rispetto a Murky, ma avrai comunque bisogno anche della riga di comando.
  • SourceTree è originariamente un client Mac, con una versione di Windows disponibile solo di recente. Interfaccia utente piuttosto carina (almeno su OS X), supporta la maggior parte delle funzionalità di Hg, incluso shelve.

plugin


3

Come si impegnano le modifiche?

Richiamare questo comando dall'attuale repository mercurial locale

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 <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

Un comando di esempio sarebbe:

hg commit -m "added readme" README

NOTE :

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

3

Come impostare Mercurial?

Mercurial memorizza le informazioni di configurazione ~/.hgrcsu sistemi * nix e %UserProfile%\mercurial.inisu 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 .hgrco mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <email.address@example.net>

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: la guida definitiva ".


3

Come si uniscono i rami?

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

Come nuovo utente mercuriale e come nuovo per il controllo delle revisioni alla fonte in generale, non capisco davvero questa risposta. Potresti chiarire ed espandere il tuo post? Non riesco ancora a capire come usare il comando merge.
Jamin Gray,

3

Come installare Mercurial?

Modifica bene se hai installato da sorgenti su Linux o hai utilizzato i programmi di installazione di Windows.

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

Usa easy_install 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 questo aggira anche il pacchetto di installazione di Mercurial OS X (alla 1.2.1 del 26 luglio 2009) lamentando la necessità di Python 2.5. Dalla documentazione , sembra che Fink e Macports installino la versione 1.2.

Linux

La maggior parte dei pacchetti espliciti di Linux 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

(da Presentazione di Mercurial, un sistema di controllo della versione distribuita )

finestre

Esiste 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, quindi collegate qui), puoi creare una versione Python ottimizzata o pura di Mercurial dalla fonte.


1
Per costruire mercurial dalla fonte, saranno necessarie le intestazioni di Python. Installa python-dev o python-devel per coloro che usano distribuzioni orientate ai pacchetti.
Nicolas Dumazet,

3

Come si ottiene l'ultimo codice?

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

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 contemporaneamente un pull e un aggiornamento.


1
L'origine viene registrata .hg/hgrcquando si esegue un clone, quindi non è necessario specificarlo quando si tira / spinge. Se lo desideri, puoi aggiungere altri percorsi alla [paths]sezione .hg/hgrc.
Martin Geisler,

3

Come controlli 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 source è la fonte dei file originali situati nel repository, dove può essere un URL remoto o una directory del file system. Per esempio:

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


1

Come si impegnano le modifiche?

$ hg commit -m "Commit message"

1

Come vedi quali modifiche verranno inviate al repository upstream quando esegui il push?

Utilizzare hg outgoingper 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à tutti i changeset per intero:

$ hg outgoing -p

1

Come si rimuove un file dal repository?

Per rimuovere un file dal repository e cancellarlo al successivo commit:

$ hg remove {file(s)}

Per rimuovere un file dal repository, ma non cancellarlo

$ hg remove -Af {file(s)}

o da Mercurial 1.3

$ hg forget {file(s)}

1

Come si torna a una versione precedente del codice?

Da questa domanda

$ hg update [-r REV]

@van: se successivamente ti impegni, creerai effettivamente una nuova filiale. Quindi potresti continuare a lavorare solo su questo ramo o eventualmente fondere quello esistente in esso.


1

Come si ripristina un changeset?

Un paio di opzioni disponibili

Easy Way (backout di 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 patch 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 senza --reverse farà la stessa cosa)

Passaggio 2 : applicare il file patch:

patch -p1 < revert-change.patch

Alcune delle differenze potrebbero non essere applicabili, 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à i contenuti del diff che non è stato possibile applicare, dovrai dare un'occhiata.


1
Non è questo ciò che hg backoutserve?
Wim Coenen,

Sì, tuttavia hg backout supporta solo un singolo id di changeset per il backout. Sicuramente va menzionato, aggiornerò di conseguenza
slf

1

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

Per mostrare la cronologia delle revisioni dell'intero repository o file

$ hg log {file(s)}

o

$ hg history {file(s)}

E per vedere l'elenco in ordine inverso

$ hg log -r:

1

Come unire parti di un ramo in un altro ramo?

Abilita l'estensione 'trapianto' nel tuo .hg / hgrc

[extensions]
transplant=

Caricare il ramo di destinazione quindi trapiantare la revisione del bersaglio.
ad es .: cherry pick revisione 81 dal ramo 'foo' al ramo corrente

$ hg transplant -b foo 81

Le versioni più recenti di Mercurial non richiedono l'estensione del trapianto. È possibile utilizzare il graftcomando integrato per fare lo stesso. hg help graftper maggiori informazioni
DOOManiac,

1

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.