2009-02-25 14 views
17

Come posso cambiare l'ora in cui ho effettuato un commit nel mio repository locale?Come cambio tempo di commit (non ancora spinto)?

Supponiamo di aver eseguito diversi commit e ho notato che la data sul mio computer è errata. Supponiamo anche che questi impegni non siano stati spinti ancora da nessuna parte.

risposta

11

Lo si può fare facilmente con MQ (Mercurial code):

Impostare una data brutta repo

+ hg init 
+ echo line 
+ hg commit -A -d 12/1 -m first 
adding file 
+ echo line 
+ hg commit -A -d 12/2 -m second 
+ echo line 
+ hg commit -A -d 12/3 -m third 
+ hg log 
changeset: 2:81c88de729a8 
tag:   tip 
user:  Ry4an Brase <[email protected]> 
date:  Thu Dec 03 00:00:00 2009 -0600 
summary:  third 

changeset: 1:c1fe70008824 
user:  Ry4an Brase <[email protected]> 
date:  Wed Dec 02 00:00:00 2009 -0600 
summary:  second 

changeset: 0:abb97adaa541 
user:  Ry4an Brase <[email protected]> 
date:  Tue Dec 01 00:00:00 2009 -0600 
summary:  first 

girare la di modifiche nella patch in coda

+ hg qimport -r 2 
+ hg qimport -r 1 
+ hg qimport -r 0 

Rendere ogni aggiusta a turno il qtip e fissa la data

+ hg qrefresh -D 
+ hg qpop 
Now at: 1.diff 
+ hg qrefresh -D 
+ hg qpop 
Now at: 0.diff 
+ hg qrefresh -D 

riapplicare le patch

+ hg qpush 
applying 1.diff 
Now at: 1.diff 
+ hg qpush 
applying 2.diff 
Now at: 2.diff 

Accendere ogni patch di nuovo in gruppi di modifiche reali

+ hg qdel -r 0 
+ hg qdel -r 1 
+ hg qdel -r 2 

tutto meglio:

+ hg log 
changeset: 2:6b51e14aadfc 
tag:   tip 
user:  Ry4an Brase <[email protected]> 
date:  Wed Feb 25 22:29:01 2009 -0600 
summary:  third 

changeset: 1:5cbb9fc51bcc 
user:  Ry4an Brase <[email protected]> 
date:  Wed Feb 25 22:29:02 2009 -0600 
summary:  second 

changeset: 0:ec58d1f24278 
user:  Ry4an Brase <[email protected]> 
date:  Wed Feb 25 22:29:02 2009 -0600 
summary:  first 
+1

Un buon modo nativo (sebbene richieda la comprensione di MQ). Grazie! –

+0

Questo inverte l'ordine di tempo che cset 2 sembra essere stato eseguito prima di cset 1. Suggerisco la seguente procedura: import; pop tutto; spingere, aggiornare, spingere, aggiornare, spingere, aggiornare, eliminare tutto. Questo sembra fare il trucco mantenendo i timestamp progressivi. –

+0

È possibile impostare le date su ciascuna con qualsiasi cosa si desideri con qrefresh, quindi in realtà entrambi i metodi funzionano allo stesso modo. –

10

C'è il flag --date per hg commit, questo è il modo in cui si sovrascrive il tempo di commit. La domanda è come ricominciare i primi cambiamenti senza molto dolore.

Supponiamo che si ottiene la seguente storia dei commit locali:

dir1> hg commit # r100, OK 
dir1> hg commit # r101, need to fix time 
dir1> hg commit # r102, need to fix time 

Ecco la mia soluzione:

hg diff -r100:101 > 101.diff 
hg diff -r101:102 > 102.diff 
cd .. 
hg clone -r100 dir1 dir2 # create a copy just before changesets than needs to be fixed 
cd dir2 
patch -i ../dir1/101.diff 
hg commit -m "Same commit message" --date="required date" 
patch -i ../dir1/102.diff 
hg commit -m "Same commit message" --date="required date" 
cd .. 
rm -rf dir1 && mv dir2 dir1 # replace working copy 

È possibile automatizzare l'applicazione di patch con hg patch che non ho usato nella mia pratica ancora .

+0

Un modo semplice e pulito. Grazie! –

+3

È possibile utilizzare semplicemente "hg strip" per rimuovere le revisioni offensive anziché la clonazione. – skypher

8

Se è solo un singolo commettere, e che commettono è la più recente uno (su qualunque ramo tu sia), un veloce one-liner per fare questo è:

hg commit --amend -d now 
Problemi correlati