Domanda

    

Questa domanda ha già una risposta qui:

    
            
  •              Mercurial: come modificare l'ultimo commit?                                      7 risposte                          
  •     
    

Attualmente sto usando TortoiseHg (Mercurial) e ho commesso accidentalmente un messaggio di commit errato. Come posso modificare questo messaggio di commit nel repository?

È stato utile?

Soluzione

Aggiornamento: Mercurial ha aggiunto --amend che dovrebbe essere il preferito opzione ora .


Puoi eseguire il rollback dell'ultimo commit (ma solo l'ultimo) con hg rollback e quindi riapplicarlo.

Importante : questo rimuove definitivamente l'ultimo commit (o pull). Quindi, se hai fatto un hg update che commit non è più nella tua directory di lavoro, è andato per sempre. Quindi crea prima una copia.

Oltre a ciò, non è possibile modificare la cronologia del repository (inclusi i messaggi di commit), poiché tutto ciò che è presente viene sommato. L'unica cosa che puoi fare è eliminare la cronologia dopo un determinato changeset e quindi ricrearla di conseguenza.

Niente di tutto ciò funzionerà se hai già pubblicato le modifiche (a meno che tu non sia in grado di ottenere tutte le copie) e non puoi anche "riscrivere la cronologia". che includono commit firmati GPG (da altre persone).

Altri suggerimenti

Beh, ero solito fare così:

Immagina di avere 500 commit e il tuo messaggio di commit errato è in r.498.

hg qimport -r 498:tip
hg qpop -a
joe .hg/patches/498.diff
(change the comment, after the mercurial header)
hg qpush -a
hg qdelete -r qbase:qtip

Buone notizie: hg 2.2 appena aggiunto git come l'opzione --amend .

e in tortoiseHg, puoi utilizzare " Modifica la revisione corrente " selezionando la freccia nera a destra del pulsante di commit

a

So che questo è un vecchio post e hai contrassegnato la domanda come risposta. Recentemente stavo cercando la stessa cosa e ho trovato molto utile l'estensione histedit . Il processo è spiegato qui:

http: //knowledgestockpile.blogspot. com / 2010/12 / cambia-commit-messaggio-di-revisione-in.html

L'ultima operazione è stata il commit in questione

Per modificare il messaggio di commit dell'ultimo commit quando l'ultima operazione mercuriale era un commit puoi usare

$ hg rollback

per ripristinare l'ultimo commit e ripetere il commit con il nuovo messaggio:

$ hg ci -m 'new message'

Ma fai attenzione perché il comando di rollback esegue anche il rollback delle seguenti operazioni:

  
      
  • import      
        
    • maglia
    •   
    • push (con questo repository come destinazione)
    •   
    • unbundle
    •   
  •   

(vedi hg help rollback )

Pertanto, se non si è sicuri se l'ultimo comando mercuriale fosse un hg ci , non utilizzare hg rollback .

Modifica qualsiasi altro messaggio di commit

Puoi utilizzare estensione mq , distribuito con Mercurial, per modificare il messaggio di commit di qualsiasi commit.

Questo approccio è utile solo quando non sono già presenti repository clonati nel pubblico che contengono il changeset che si desidera rinominare perché in tal modo si altera l'hash del changeset e tutti i changeset seguenti.

Ciò significa che devi essere in grado di rimuovere tutti i cloni esistenti che includono il changeset che vuoi rinominare, altrimenti spingere / tirare tra loro non funzionerebbe.

Per utilizzare l'estensione mq devi abilitarla esplicitamente, ad es. sotto UNIX controlla il tuo ~ / .hgrc , che dovrebbe contenere le seguenti righe:

[extensions]
mq=

Supponi di voler modificare la revisione X: prima qimport importa le revisioni X e seguenti. Ora sono registrati come una pila di patch applicate. Popping ( qpop ) lo stack completo tranne X rende X disponibile per le modifiche tramite qrefresh . Dopo aver modificato il messaggio di commit, è necessario inviare nuovamente tutte le patch ( qpop ) per riapplicarle, ovvero per ricreare le seguenti revisioni. Lo stack di patch non è necessario, pertanto può essere rimosso tramite qfinish .

Il seguente script demo mostra tutte le operazioni in azione. Nell'esempio il messaggio di commit del terzo changeset è stato rinominato.

# test.sh
set -x -e -u
echo INFO: Delete old stuff
rm -rf .hg `seq 5`
echo INFO: Setup repository with 5 revisions
hg init
echo '[ui]' > .hg/hgrc
echo 'username=Joe User <juser@example.org>' >> .hg/hgrc
echo 'style = compact' >> .hg/hgrc
for i in `seq 5`; do
  touch $i && hg add $i && hg ci -m "changeset message $i" $i
done
hg log 
echo INFO: Need to rename the commit message or the 3rd revision
echo INFO: Displays all patches
hg qseries
echo INFO: Import all revisions including the 3rd to the last one as patches
hg qimport -r 2:tip
hg qseries
echo INFO: Pop patches
hg qpop 2.diff
hg qseries
hg log 
hg parent
hg qrefresh -m 'CHANGED MESSAGE'
hg log 
echo INFO: Push all remaining patches
hg qpush -a
hg log 
hg qseries
echo INFO: Remove all patches
hg qfinish -a
hg qseries && hg log && hg parent

Copialo in una directory vuota ed eseguilo ad es. via:

$ bash test.sh 2>&1 | tee log

L'output dovrebbe includere il messaggio del changeset originale:

+ hg log
[..]
2   53bc13f21b04   2011-08-31 17:26 +0200   juser
  changeset message 3

E l'operazione di rinomina il messaggio modificato:

+ hg log
[..]
2   3ff8a832d057   2011-08-31 17:26 +0200   juser
  CHANGED MESSAGE

(Testato con Mercurial 1.7.5)

In TortoiseHg, fare clic con il tasto destro del mouse sulla revisione che si desidera modificare. Scegli Modifica cronologia & Importa MQ. Ciò convertirà tutte le revisioni fino ae includendo la revisione selezionata dai cambiamenti di Mercurial in patch di Mercurial Queue. Seleziona la Patch per cui vuoi modificare il messaggio e dovrebbe cambiare automaticamente la schermata nell'editor MQ. Modifica il messaggio che si trova al centro dello schermo, quindi fai clic su QRefresh. Infine, fai clic con il pulsante destro del mouse sulla patch e scegli Modifica cronologia- > Finish Patch, che la convertirà da una patch in un set di modifiche.

Oh, questo presuppone che MQ sia un'estensione attiva per TortoiseHG su questo repository. In caso contrario, dovresti essere in grado di fare clic su File- > Impostazioni, fare clic su Estensioni e fare clic sulla casella di controllo mq. Dovrebbe avvisarti che devi chiudere TortoiseHg prima che l'estensione sia attiva, quindi chiudi e riapri.

Come altri hanno già detto, l'estensione MQ è molto più adatta a questo compito e tu non corri il rischio di distruggere il tuo lavoro. Per fare questo:

  1. Abilita l'estensione MQ, aggiungendo qualcosa di simile a hgrc:
    [extensions]
    mq =
    
  2. Aggiorna al changeset che vuoi modificare, in genere punta:
    hg up <rev>
    
  3. Importa il changeset corrente nella coda:
    hg qimport -r .
    
  4. Aggiorna la patch e modifica il messaggio di commit:
    hg qrefresh -e
    
  5. Termina tutte le patch applicate (una, in questo caso) e memorizzale come changeset regolari:
    hg qfinish -a
    

Non ho familiarità con TortoiseHg, ma i comandi dovrebbero essere simili a quelli sopra. Credo anche che valga la pena ricordare che la cronologia delle modifiche è rischiosa; dovresti farlo solo se sei assolutamente sicuro che il changeset non è stato spinto o estratto da nessun'altra parte.

Il roll-and-riapply è davvero una soluzione semplice, ma può aiutare solo con l'ultimo commit. Mercurial Queues è molto più potente (si noti che è necessario abilitare l'estensione delle code mercurial per poter utilizzare " hg q * " comandi).

L'ho fatto in questo modo. Innanzitutto, non spingere le modifiche o sei sfortunato. Prendi e installa l'estensione collapse . Commettere un altro changeset fittizio. Quindi utilizzare la compressione per combinare le due modifiche precedenti in una sola. Ti chiederà un nuovo messaggio di commit, dandoti i messaggi che hai già come punto di partenza. Hai effettivamente modificato il messaggio di commit originale.

Un hack che uso se la revisione che voglio modificare non è così vecchia:

Diciamo che sei alla rev 500 e vuoi modificare 497.

hg export -o rev497 497
hg export -o rev498 498
hg export -o rev499 499
hg export -o rev500 500

Modifica il file rev497 e cambia il messaggio. (È dopo le prime righe precedute da " # ")

hg import rev497
hg import rev498
hg import rev499
hg import rev500

Esiste un altro approccio con l'estensione MQ e comandi di debug . Questo è un modo generale per modificare la cronologia senza perdere dati. Consentitemi di assumere la stessa situazione di Antonio .

// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498

Un piccolo gioiello nella discussione sopra - grazie a @Codest e @Kevin Pullin. In TortoiseHg, c'è un'opzione a discesa adiacente al pulsante di commit. Selezione di " Modifica revisione corrente " riporta il commento e l'elenco dei file. COSÌ utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top