2010-01-26 11 views
10

Se ho sfornato il codice per un po 'e ho dimenticato di creare una serie di patch mentre procedo, come posso creare la serie di patch in modo retrospettivo? Finora l'unica cosa che viene in mente è:Come dividere il lavoro in più patch con code mercuriali?

# Prepare and test the first batch of changes. 
$ hg qrecord -m 'first batch' 1.patch 
$ hg qnew -m 'stash downstream changes' stash-1.patch 
$ hg qdelete -k temp-1.patch 
$ make hello 
cc  hello.c -o hello 
hello.c: In function ‘main’: 
hello.c:4: error: syntax error at end of input 
make: *** [hello] Error 1 
$ echo '}' >> hello.c 
$ make hello 
cc  hello.c -o hello 
$ hg qrefresh 

# Recover the stashed changes. 
$ patch -p1 < .hg/patches/last.patch 

# And around we go again! 
$ hg qrecord -m 'second batch' 2.patch 
$ hg qnew -m 'stash downstream changes' stash-2.patch 
$ hg qdelete -k stash-2.patch 
$ make hello 
... 

Questo approccio molto macchinoso è anche pericoloso. Potrei dimenticare lo -k su qdelete, a quel punto andrò a colpire la fronte contro un muro di mattoni per diversi minuti, o potrei includere troppo o troppo poco durante l'operazione qrecord.

C'è un modo migliore?

(Quello che mi piacerebbe davvero essere in grado di hg qpop a poco prima di una patch che voglio dividere, e utilizzare un comando attualmente inesistente, hg qunrecord, per aspirare in modo interattivo le modifiche dalla patch nella mia directory di lavoro Una volta che sono soddisfatto delle modifiche, hg qnew -f potrebbe spremere una nuova patch di fronte a quella precedente.)

+0

Questa domanda è la suddivisione in diverse patch per file? Vale a dire. le modifiche per un determinato file non vengono suddivise tra più patch. Perché se così fosse, si può fare meglio dell'approccio che hai descritto sopra. Questa è una vecchia domanda, ma ancora pertinente. –

+0

@FaheemMitha: Sono passato a git un po 'di tempo fa, quindi non è particolarmente rilevante per me.Ma per la cronaca, io sicuramente voglio differenziare le modifiche all'interno dei file, specialmente i file di progetto di livello superiore che spesso contengono più aggiunte/cancellazioni di file non correlate. In realtà, questa è quasi la norma piuttosto che l'eccezione. –

+0

Ok. Grazie per il feedback, Marcelo. –

risposta

6

Il MQTutorial spiega come dividere le patch. Quindi potresti creare una patch dal tuo lavoro corrente e dividerla in più patch.

+0

Grazie. Non è una soluzione ideale, ma è molto meglio di quello che ho fatto finora. –

+3

Quello che faccio di solito è usare due repository e un simpatico strumento di visualizzazione visuale come Beyond Compare. Usando i nomi nel tutorial, comincio con repo A con OP applicato, e io clonerò A a B. Poi in AI 'qpop -a', diff A e B, seleziona i cambiamenti per P1 per copiare da B a A , 'qnew -f P1', quindi copia il resto,' qnew -f P2'. –

2

Penso che lo crecord extension ti consenta di farlo. Ti offre un'interfaccia interattiva basata su curses in cui puoi scegliere esattamente cosa c'è in un commit.

+0

Sulla base di una lettura superficiale, crecord sembra essere un equivalente basato su curses all'estensione del record. Grazie per aver segnalato questa estensione, in quanto sembra abbastanza utile. Tuttavia, non sembra ridurre il numero di passaggi che devo eseguire; rende solo il primo passo più piacevole. –

+1

@MarceloCantos, qcrecord riduce i passaggi. Mentre qrecord mi dice quasi sempre "non posso modificare la patch per l'intero file", qcrecord mi consente di escludere hunks e linee arbitrarie nelle mie patch. –

2

TortoiseHg ha caratteristica molto utile "Hunk Selezione" nella finestra di dialogo per Commit tipo di questo lavoro:
http://tortoisehg.bitbucket.io/manual/2.0/commit.html#change-selection

+0

La maggior parte del mio lavoro non è in Windows, ma lo uso occasionalmente, quindi grazie per il suggerimento. Sfortunatamente, come per il suggerimento di @ RyanWilcox, questo sembra aiutare il primo passo nel mio processo, piuttosto che semplificare il processo nel suo complesso. –

+2

FYI: Se necessario, è possibile eseguire TortoiseHg su Linux e Mac OS :) http://bitbucket.org/tortoisehg/stable/wiki/install – kuy

+0

Non ne avevo idea! È bello saperlo. –

1

Abilita estensioni built-in:

[extensions] 
mq= 
record= 
shelve= 

poi passare MQ in lavoro degli alberi e split modifiche e rimuovere patch originale:

$ hg qpop my.patch 
$ patch -p1 <.hg/patches/my.patch 

$ hg qnew -i my1.patch 
.... 
$ hg qnew -i my2.patch 
.... 
$ hg qnew myN.patch # last without interactive stuff 

$ hg qdelete --keep my.patch 

Tra my$i.patch e my$((i+1)).patch è possibile utilizzare hg shelve/hg unshelve per verificare se il progetto è stato creato e superato i test su my$i.patch senza modifiche successive!

Se si scopre che manca qualcosa su questo stage, utilizzare hg qref su modifiche con shelving o hg qref -i su modifiche non eliminate!

Vedi anche Mercurial: move MQ patch to shelve?

0

In primo luogo, installare crecord perché è solo un modo modo modo più bello di frazionamento cambia in su.

$ hg qcrecord part1 
$ hg qnew part2 # ok, slightly a lie at this point 
$ hg qpop 
$ echo "}" >> hello.c 
$ hg qrefresh 
$ hg qpush 
$ hg qcrefresh # Keep just what you want in part2 
$ ... 

L'unica cosa speciale per crecord qui è il comando qcrefresh. Se non sei un fan delle maledizioni, puoi comunque fare tutte le stesse cose qui, basta sostituire qcrefresh con hg qrefresh -X 're:.'. O hg qrefresh -I aauuuuuggghhh se preferisci. (È il tuo "uncommit" usando -X o -I.)

Problemi correlati