2009-04-29 2 views
8

Quando si esegue un'unione con Mercurial, si desidera unire i file in conflitto uno alla volta che non è un flusso di lavoro produttivo su set di grandi dimensioni. Invece, quello che mi piacerebbe fare è unire l'intero changeset di entrambe le teste (come usare kdiff3 per diff 2 teste). Per me sembra semplice ma non riesco a capire come ottenerlo.Come posso eseguire una fusione basata su changeset invece di unione basata su file con Mercurial?

Finora, il più vicino che posso ottenere è passare attraverso l'unione nel modo consueto, lasciare tutti i conflitti irrisolti (un file alla volta ...), e quindi hg vdiff -rHead1 -rHead2 - ma vdiff (usando kdiff3) non lo fa Sembra che ci siano opzioni per passare lo strumento a una directory di output (la directory di lavoro corrente) e invece lancia con la directory di output come tempdir (forse -o è la risposta?).

Lasciatemelo dire in un altro modo: voglio utilizzare kdiff per unire due testine nella mia directory di lavoro. Voglio che i risultati nella mia directory di lavoro siano la mia fusione che posso commettere.

Mi manca qualcosa di ovvio, non posso essere l'unico che vuole farlo.

+0

Ero un po 'confuso dal fraseggio della domanda. I changeset in Mercurial sono pezzi di storia immutabili; qui IIUC si desidera unire un intero albero di file contemporaneamente anziché file per file. –

risposta

0

Provare a impostare ui.merge. Vedi this page per maggiori dettagli.

+0

forse la mia domanda non è abbastanza chiara - a prescindere dall'impostazione di ui.merge, otterrò comunque una fusione file alla volta da mercurial, piuttosto che un intero changeset rispetto a changeset merge (a meno che non mi manchi qualcosa?) – jsaylor

+0

Sono ancora un po 'confuso - non avresti ancora bisogno di kdiff per mostrare file in conflitto uno alla volta? O può risolvere tutti i tuoi conflitti senza l'intervento manuale? –

1

Penso che this risponda alla tua domanda.

+0

Buon articolo, ma sto ancora cercando di unire le teste (non i changeset nel ramo centrale). La mia domanda non era del tutto chiara su questo punto. – jsaylor

3

Ho inoltrato la domanda a #mercurial su irc.freenode.net un paio di giorni fa. mpm (l'autore di Mercurial) ha dato una sorta di risposta (era solo una mezza risposta, quindi non l'ho subito trasmesso qui). Ha detto che si potrebbe essere in grado di fare qualcosa in cui si consente a Mercurial di unire automaticamente i file (e di inserire i marcatori di unione <<<< e >>>> in presenza di conflitti).

Quindi utilizzare uno strumento di unione che conosca questi indicatori: questo consente di risolverli tutti in una volta anziché eseguirli su file per file. Un punto di partenza sarebbe la pagina merge tool configuration. Spiega che

 
[ui] 
merge = internal:merge 

farà in modo che Mercurial inserisca gli indicatori di unione. Qui l'ho testato creando due file x.txt e y.txt che poi ho modificato con modifiche in conflitto in due cloni. La fusione ha dato semplicemente:

 
% hg merge 
merging x.txt 
warning: conflicts during merge. 
merging x.txt failed! 
merging y.txt 
warning: conflicts during merge. 
merging y.txt failed! 
0 files updated, 0 files merged, 0 files removed, 2 files unresolved 
use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon 

Tutti i file sono stati elaborati in un colpo solo, io non ho dovuto confermare nulla per file come si descrive.

I file contengono ora unire i marcatori in questo modo:

% cat x.txt 
foo 
<<<<<<< local 
hehe 
======= 
foobar 
>>>>>>> other 

Il passo successivo è quello di trovare uno strumento che può prendere un albero di directory con questi file e ti permettono di risolverli. Ho guardato kdiff3, ma non ho capito come usarlo per operare su un singolo file da solo, sembra molto concentrato sul confronto di coppie di file/directory.

Non sono sicuro di quanto questa mezza risposta ti aiuti, forse sei rimasto bloccato a questo punto? Ma spero che possa aiutare gli altri che vogliono inserire i marcatori di fusione in tutti i file e quindi risolvere i conflitti a mano.

+0

Eri vicino all'idea di lasciare che i file non risolti restassero. Penso di aver trovato una risposta più completa, ma usando questa strategia, che ho appena postato qui. – jsaylor

+0

Sono molto contento che tu abbia trovato almeno un modo per raggiungerlo, anche se non è un modo perfetto. Si potrebbe fare un'estensione per far fluire meglio il lavoro, ma faccio così pochi si fondono che non lo scriverò :-) –

0

suona come si desidera che il comando di extdiff:

ho questi nel mio ~ /.hgrc (io preferisco fusione, ma si può cambiare a KDiff3, ecc)

[extensions] 
hgext.extdiff = 

[extdiff] 
# add new command called meld, runs meld (no need to name twice) 
cmd.meld = 

Con extdiff vostre unioni si verificano nella directory di lavoro, e per di più si può passare qualsiasi parametro supplementare al vostro programma diff con -o:

$ hg help extdiff 

hg extdiff [Alt] ... [fILE] ... programma esterno

uso di diff repository (o file selezionati)

Show differences between revisions for the specified files, using 
an external program. The default program used is diff, with 
default options "-Npru". 

To select a different program, use the -p option. The program 
will be passed the names of two directories to compare. To pass 
additional options to the program, use the -o option. These will 
be passed before the names of the directories to compare. 

When two revision arguments are given, then changes are 
shown between those revisions. If only one revision is 
specified then that revision is compared to the working 
directory, and, when no revisions are specified, the 
working directory files are compared to its parent. 

opzioni:

-p --program programma di confronto per eseguire l'opzione passaggio
-o --opzione al programma di confronto
-r --rev revisione
-I --include includono nomi corrispondenza dei pattern dati
-X --exclude escludere nomi corrispondenti ai modelli forniti

+0

Il mio problema è che è ancora file per file, e non mi dà un intero changeset rispetto all'approccio di fusione con changeset. – jsaylor

4

mi si avvicinò con una soluzione che consente di ottenere quello che voglio, ma mi sento ancora come se fosse un kludge.

  • Inizia con un dir di lavoro vuoto con 2 teste: Mine e Their.
  • Aggiornamento lavorando dir a Mine:
    hg update [My head's rev here]
  • esegue una stampa, ma non riescono tutti i file che Merc non è in grado di gestire automaticamente senza lanciare uno strumento di unione e di mantenere il "mio" file quando in conflitto:
    hg --config "ui.merge=internal:fail" merge

Vedere https://www.mercurial-scm.org/wiki/TipsAndTricks#head-9f405488b6d3b3d092a09aafa28db515ba44c742 per informazioni su come unire/fallire.

Ora ho una directory di lavoro con quanto possa capire l'auto, ma tutti i file in sospeso ancora non sono stati modificati da Mine. (Usa -l hg risolvere per vedere lo stato risoluzione del Mercurial di file correnti)

  • ora posso Vdiff mio dir di lavoro contro la testa La loro che mi dà l'alto livello, merge di modifiche da changeset che cercavo per.

hg vdiff -r [Theirs head's rev here]

Nota: Se si sta utilizzando WinMerge per i vostri vdiffs, quindi assicurarsi che ha uno switch/R come opzione che farà una sottodirectory confrontare e - se WinMerge config è impostato per utilizzare Tree-View: fornirà un ottimo confronto tra gli alberi. Da Mercurial.ini:

[extdiff]
cmd.vdiff = C:\Program Files\WinMerge\WinMergeU.exe
opts.vdiff = /e /ub /r /dl other /dr local

Ora posso lavorare in tutta la directory che include i file irrisolti e fare ampie modifiche del progetto, se necessario (. Es forse risolvere un unico file richiede ulteriori modifiche in un altro).

  • Al termine, risolvere per contrassegnare tutti i file risolti per Merc e quindi eseguire il commit.
    hg resolve -m

Accidenti! Spero che questo aiuti qualcun altro!

+0

Sembra una soluzione perfetta ma davvero folle :) Dovresti accettarla come una tua risposta. –

+0

(Bump) Ora, accetta questa risposta ... –