2013-07-30 17 views
6

Molti file nel nostro repository Mercurial sono stati spostati in un singolo commit, ma questi file non sono stati contrassegnati come rinominati. A peggiorare le cose, alcuni dei file sono stati modificati nello stesso commit.Correzione dei nomi in un repository Mercurial dopo il commit

Come è possibile eseguire il backout del changeset e rilevare correttamente i nomi, mantenendo le modifiche e il file si sposta?

risposta

0
  1. Fare un elenco di tutte le modifiche apportate ai file.
  2. Aggiornamento a una versione in cui i file non erano stati spostati.
  3. Rinominare i file.
  4. Modificare gli interni del file, se necessario.
  5. Commit.
+0

Fare un elenco di tutte le modifiche, tornare ai pre-cambiamenti, quindi aggiornare manualmente ogni file sembra il modo più manuale per farlo. Speravo in un modo più automatico, a prova di idiota. –

+0

Mercurial non sa come i tuoi cambiamenti debbano essere diversi. Non c'è "sostituire i file cancellati e aggiunti i cui nomi sono simili con la ridenominazione di quei file". Git sarebbe meglio qui, guarda il contenuto e probabilmente ti suggerirebbe di cambiare i nomi dei file o qualcosa, piuttosto che cancellare e aggiungere i file. – MrFox

2

versione automatizzata della risposta di MrFox

  1. cambiamenti esportazione di changeset "cattivo" in patch-file (git-format, forse) o salvare per impacchettare o convertirlo in MQ-patch
  2. Aggiornamento dir lavorando per il genitore di changeset sbagliati
  3. applicare la patch | importazione fascio
  4. Usa hg addremove -s NN in modificabile con dir al fine di rilevare rinomina (NN deve essere trovata a mano, tutte le rinomina devono essere rilevati nel risultato), controllare Resul ts di indovinare con hg status -C, ripetono adremove fino corretto risultato non sarà ricevuto
  5. Commit nuova buona changeset
10

C'è un'alternativa alla elaborazione dello storico (aka gingillarsi in MQ) per il fissaggio rinomina. La procedura manuale è delineata come here come logica utilizzata dall'estensione di fixrenames.

La procedura manuale è la seguente. Per ogni revisione N per i quali vi sono rinomina non contrassegnati:

$ hg update n-1 
$ hg revert --all --rev n 
$ hg addremove -s 70 
$ hg commit -m "Fix renames from n" 
$ hg merge n 

Nota che la bandiera similitudine a volte richiede giocherellare. Il motivo è che le rinomine non sono quasi mai dei rinomati. Ad esempio, la ridenominazione di una classe richiede una modifica nel file e una modifica nel nome file. Quindi non sono al 100% uguali. Dovrai rivedere cosa fa addremove e assicurarti che i file aggiunti siano contrassegnati come "X (rinominato da Y)".

In questo modo è possibile recuperare la cronologia completa senza un po 'di lavoro manuale. Dovevo farlo oggi (senza usare l'estensione fixrenames) e mi ci sono voluti circa 5 minuti per risolvere il problema.

È possibile applicare questa procedura anche in caso di set di modifiche impilati da correggere.

Il grafico del changeset sarebbe simile a questo. Si consideri changeset A, B, C & D. B e D aveva rinomina errati:

D 
| 
C 
| 
B 
| 
A 

Innanzitutto aggiornamento di una, fare un inplace ripristinare B, facciamo l'addremove e compiere come E. Poi si fondono in C E come F poiché C non ha avuto niente di sbagliato in questo.Si dovrebbe vedere qualcosa di simile:

F D 
|\| 
| C 
| | 
E B 
|/ 
A 

Ora applicare lo stesso per D. Aggiorniamo a F, tornare da D, addremove e si impegnano a G. Ora dobbiamo solo si fondono per chiudere la testa in più. Si dovrebbe vedere qualcosa di simile:

H 
|\ 
G | 
| | 
F D 
|\| 
| C 
| | 
E B 
|/ 
A 

Se si vuole convincere la vostra auto che questo ha lavorato si può sempre

hg diff -r D -r H 

A seconda del vostro strumento, vedrete sia alcuna differenza o file rinominati elencato ma senza differenze tra loro.

+0

La riga di comando dice 'hg merge n' ma il grafico indica un'unione con' n + 1'? –