2010-04-23 13 views
7

Nei bei vecchi tempi di Subversion, a volte derivavo un nuovo file da uno esistente usando svn copy. Quindi se qualcosa è cambiato nelle sezioni che avevano in comune, potrei comunque usare svn merge per aggiornare la versione derivata.In Mercurial, posso applicare le modifiche da un file a un altro file nello stesso ramo?

Per utilizzare l'esempio da hginit.com, dicono che la ricetta "guac" esiste già, e voglio creare un "superguac" che include le istruzioni su come servire guacamole a 1000 fan delirio di calcio. Usando il processo che ho appena descritto, potrei:

svn cp guac superguac 
svn ci -m "Created superguac by copying guac" 
(edit superguac) 
svn ci -m "Added instructions for serving 1000 raving soccer fans to superguac" 
(edit guac) 
svn ci -m "Fixed a typo in guac" 
svn merge -r3:4 guac superguac 

e quindi la correzione di errore sarebbe stata applicata a superguac.

Mercurial fornisce un comando hg copy che contrassegna un file come una copia dell'originale, ma non sono sicuro che la struttura del repository supporti un flusso di lavoro simile. Ecco lo stesso esempio, ed io con cura solo modificare un singolo file nel impegno che voglio utilizzare nella stampa:

hg cp guac superguac 
hg ci -m "Created superguac by copying guac" 
(edit superguac) 
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" 
(edit guac) 
hg ci -m "Fixed a typo in guac" 

Ora voglio applicare la modifica in guac a superguac. È possibile? Se è così, qual è il comando giusto? Esiste un diverso flusso di lavoro in Mercurial che raggiunge gli stessi risultati (limitato a un singolo ramo)?

+0

riconosco questo particolare esempio è abbastanza facile da rifondere utilizzando rami e Mercurial risolve questa situazione banalmente. Sfortunatamente, nella mia vera applicazione ho bisogno di entrambi i file nello stesso ramo, quindi la mia difficoltà ... – Stephen

+0

Dopo aver riflettuto su questo aspetto (e testando entrambe le soluzioni nel mio repository), penso che entrambe le risposte abbiano un merito. Se avessi già conosciuto la risposta di Rudi in precedenza, tutte le modifiche che si applicano a entrambi i file potrebbero utilizzare il suo metodo. Sfortunatamente da quando ho modificato entrambi i file dopo la copia, la soluzione di Ry4an mi offre una soluzione alternativa. Grazie a tutti e due! – Stephen

risposta

6

È possibile farlo

hg cp guac superguac 
hg ci -m "Created superguac by copying guac" # CS1 
(edit superguac) 
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" # CS2 
hg up -r revision-before-copy 
(edit guac) 
hg ci -m "Fixed a typo in guac" #CS3 
hg merge # this will transfer the typo-fix both to guac and superguac 
hg ci -m "merged typo-fix from guac" # CS4 

Dopo questo repository si presenta così

CS1 <--- CS2 <--------- CS4 
    \     /
    \--<-------- CS3 -<-/ 
+0

Oh, questo è subdolo ... (anche se immagino dal punto di vista corretto non lo è) Quindi la tua soluzione crea più teste e quindi le unisce.Ma a un livello più profondo, questo metodo "inserisce" un cambiamento nella storia di superguac in ordine cronologico. E 'davvero bello, e penso che il mio modello mentale di DVCS sia appena migliorato! Grazie! – Stephen

+0

Uno dei punti chiari che DVCS ha su CVCS è che quest'ultimo ti costringe a guardare la cronologia dei commit in modo più lineare e in termini di "revisioni". Il primo ha un DAG al centro del suo modello di storia, che è molto più flessibile, e dovresti pensare ai commit come insiemi di "cambiamenti". – Santa

+0

@Santa Avevo letto del DAG, ma credo di non averlo ancora interiorizzato. Questo è un buon esempio per aiutarmi ad ancorare ciò che il DAG in realtà significa in DVCS (e lo sto condividendo anche in ufficio per aiutare gli altri a cogliere il concetto). – Stephen

9

Non c'è modo puro-mercuriale di andare cross-file con le patch, ma se patch è installato sul vostro sistema si potrebbe ottenere essenzialmente la stessa cosa, seguendo la vostra serie di comandi Mercurial con:

hg log -p -r tip -I quac | patch superquac 

Questo è in sostanza dicendo: "prendere la diff (-p) che è stato applicato a file quac (-I quac) nel più recente di modifiche (-r tip) inviarlo allo standard output (hg log), e l'uso che come input per la patch (| patch) comando che agisce su fi le superquac (superquac).

+0

Hm ... Per una soluzione non hg, questa è carina e concisa. Inoltre mi chiedo se un'estensione hg potrebbe essere in ordine. Grazie! – Stephen

+0

Mayhaps. Ho saltato svn, passando dal CVS direttamente al mercurial, quindi non ho mai saputo che svn avesse quella funzionalità. Onestamente suona come qualcosa che potrebbe scoraggiare un buon refactoring del tipo che evita di creare la stessa patch in più file. –

+0

A giudicare da quale 'hg help log' dice, dovrebbe essere possibile specificare anche un altro ramo (' --branch BRANCH') e quindi anche trasferire le modifiche da un file diverso in un ramo diverso. – Tobias

Problemi correlati