2012-11-20 13 views
18

This answer mostra come è possibile ridurre un commit a una patch, ma come posso convertire una patch di mq solo in modifiche locali?Come posso convertire una patch Mercurial queue solo alle modifiche locali?

+0

Siamo spiacenti, ma mq patch ** è ** già "solo modifiche locali", AFAIK. Perché vuoi qualcosa di più? –

+4

'Cambiamenti locali' è la terminologia Mercurial per le modifiche che non sono in un changeset o tracciate da una patch Mercurial. Ci possono essere diversi motivi per voler convertire una patch in modifiche locali. Comunque, ho avuto bisogno di farlo più volte e non ho trovato la risposta su Stack Overflow né tramite googling (ho dovuto RTFM), quindi ho condiviso la risposta quando l'ho trovata nel caso in cui gli altri volessero fare lo stesso. – Lstor

risposta

21

Risposta breve

Assicurarsi che il cerotto viene applicato, quindi:

hg qrefresh nothing 
hg qpop --keep-changes 
hg qdelete "Name of patch" 

Risposta lunga

In primo luogo, è necessario assicurarsi che nessuna modifica sono tracciati dalla patch . Per fare questo, utilizzare

hg qrefresh nothing 

nothing è solo un nome di file casuale che non è nel repository. Di solito uso hg qref 0 per brevità. hg qrefresh accetta un modello di file opzionale. Se viene fornito, la patch tiene traccia delle modifiche che corrispondono al modello e solo a quelle. Quando nulla corrisponde al modello del file, nessuna modifica verrà tracciata dalla patch e quindi ci saranno solo modifiche locali.

Ora hai una patch inutile in giro e hai alcune modifiche locali. Per pulire, è possibile fare

hg qpop --keep-changes 

per inserire la patch anche se sono presenti modifiche locali. Infine, per rimuovere la patch morti, vuoti e non applicata è possibile utilizzare

hg qrm "Name of patch" 

Non è possibile rimuovere una patch applicata, che è il motivo per cui è necessario il passaggio hg qpop --keep-changes.

(Nota: hg qrm e hg qremove sono gli alias di hg qdelete.)

Se si utilizza TortoiseHg

Con TortoiseHg, esportando la patch negli appunti (Workbench> tasto destro del mouse la patch> Esporta> Copia Patch), quindi lapplicazione della patch e infine l'importazione dagli Appunti con la destinazione "Directory di lavoro" sembra funzionare. Ecco alcune catture di schermo dimostrando questa procedura: enter image description here

+3

'--keep-changes' non è più un'opzione valida per' hg qpop'.Secondo 'hg help qpop', sembra' --force' è ora l'opzione che acheives quello che vogliamo qui: "-f --force dimentica eventuali modifiche locali ai file patchati" – sjbx

+0

'hg qrefresh 0' fallisce con 'Il sistema non trova il file specificato.' L'alternativa che ho trovato (sintassi di powershell): 'hg qrefresh --exclude" $ (hg root) "'. Questo dice a MQ di escludere tutto nel repository. Per qualsiasi ragione, solo '.' non ha funzionato, e ho dovuto specificare il percorso completo (quindi,' hg root'). – moswald

+0

@CraftyThumber Vedo ancora '--keep-changes', e AFAICT' --force' perderà le modifiche che stiamo cercando di salvare. – moswald

6

Un'alternativa senza dubbio più semplice:

hg qfinish qtip 
hg strip -k tip 

Cioè, finire la patch e quindi rimuovere il commit, pur mantenendo le sue modifiche (l'opzione -k-strip) risultante .

Problemi correlati