Vedere il answer below di Magras de La Mancha per una soluzione migliore con Mercurial 3.1. Il seguente è una soluzione più semplice e ingenua per le versioni precedenti di Mercurial.
Sì, è necessario configurare un costume merge tool per il file .hgtags
. Mercurial non fornisce alcun strumento di unione speciale per .hgtags
, è necessario fonderlo manualmente utilizzando il normale strumento di unione a tre vie.
conflitti nel file .hgtags
può avere due tipi:
conflitti stupidi: Questa è la situazione che hai e non c'è davvero un conflitto qui.Quello che succede è che un ramo ha
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
12e0fdbc57a0be78f0e817fd1d170a3615cd35da C
e l'altro ramo ha
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
979c049974485125e1f9357f6bbe9c1b548a64c3 D
Ogni tag si riferisce ad esattamente un changeset, quindi non c'è alcun conflitto qui. La fusione dovrebbe naturalmente essere la unione una delle due file:
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
12e0fdbc57a0be78f0e817fd1d170a3615cd35da C
979c049974485125e1f9357f6bbe9c1b548a64c3 D
conflitti reali: C'è un ramo ha
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
12e0fdbc57a0be78f0e817fd1d170a3615cd35da C
e l'altro ramo ha
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
979c049974485125e1f9357f6bbe9c1b548a64c3 C
C'è un vero conflitto qui: hg tag C
è stato fatto su entrambi i rami, ma il t ags si riferiscono a diversi changeset. Risolvere questo è un compito manuale.
Se si può garantire che avrete solo conflitti stupide e che hai solo un tag per ogni changeset, quindi è possibile utilizzare
hg log -r "tagged()" --template "{node} {tags}\n" > .hgtags
per generare un nuovo file di .hgtags
. L'intuizione chiave è che Mercurial sa come unire internamente i tag! Lo fa sempre quando hai due teste con diversi file .hgtags
. Il modello sopra riportato genera semplicemente un nuovo file .hgtags
basato su questa unione interna.
Se si potrebbe avere più di un tag per ogni changeset, quindi quanto sopra non funzionerà - tutti i tag sono stampati su una riga in modo da ottenere un tag foo bar
invece di due tag foo
e bar
. È quindi possibile utilizzare invece questo style file:
changeset = "{tags}"
tag = "{node} {tag}\n"
Produce una linea per tag, non changeset. Si salva questo stile da qualche parte e configurare uno strumento di unione:
[merge-tools]
hgtags.executable = hg
hgtags.args = log -r "tagged()" --style ~/tmp/tags-style > $output
hgtags.premerge = False
hgtags.priority = -1000
[merge-patterns]
.hgtags = hgtags
Si dispone ora di tag automatico si fonde. Ci sono alcune avvertenze:
tre o più teste: La tecnica funziona solo se si dispone di due teste al momento della fusione. Se hai tre teste o più, è possibile che un tag cancellato riappaia. Se hai le teste X, Y e Z, e il tag A
viene cancellato in X, Mercurial è normalmente in grado di capire che A
viene eliminato nel suo complesso. Lo fa in base a una riga 000...0 A
nel file .hgtags
in X. Tuttavia, se si uniscono X e Y per ottenere W, l'approccio suggerito non conterrà alcuna riga di tipo 000...0 A
. La definizione di A
da Z diventerà improvvisamente effettiva e reintrodurrà A
.
conflitti reali: Se si dispone di veri e propri conflitti in .hgtags
, allora il metodo di cui sopra sarà silenziosamente scegliere il tag dal più recente testa per voi. Lo strumento di unione salva fondamentalmente hg tags
in .hgtags
e il comportamento di hg tags
con più teste è explained in the wiki. Poiché hg tags
legge incondizionatamente e unisce in modo invisibile il file .hgtags
da tutte le teste, non c'è nulla che possiamo fare al riguardo con questo semplice approccio. Affrontare questo richiede uno script più grande che legge i due file .hgtags
e rileva il conflitto.
fonte
2012-03-20 08:27:18
Vedi https://bitbucket.org/xrstf/tagsmerger/wiki/Home per uno strumento di unione che risolve i conflitti sciocchi. :) – xrstf
@xrstf: l'ho visto l'altro giorno. Non l'ho raccomandato perché non penso che funzioni correttamente quando ci sono più di due teste. Semplicemente cancellando le righe '000 ... 0' si reintroducono i tag come spiego nella mia risposta. –
Eccellente, mi congratulo! Posso chiederti, quando questo notrs apparirà sul sito di Aragost? Lo perderemo qui –