2009-02-25 4 views
17

Wie kann ich die Zeit ändern, die ich in meinem lokalen Repository festgeschrieben habe?Wie ändere ich die Commit-Zeit (noch nicht gedrückt)?

Angenommen, ich habe mehrere Commits gemacht und festgestellt, dass das Datum auf meinem Computer falsch ist. Nehmen Sie auch an, dass diese Commits noch nirgendwo hingedrängt wurden.

Antwort

11

Sie können es leicht mit MQ (Mercurial Queues):

ein schlechtes Datum 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 

die Changesets in Patches in der Warteschlange Drehen einrichten

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

jedes Make patch die qtip reihenfolge und fix das datum

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

Wenden Sie die Patches

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

Schalten jeder Patch wieder in reale Change

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

Alle besser:

+ 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

Ein guter nativer Weg (obwohl Verständnis von MQ erfordert). Vielen Dank! –

+0

Dies invertiert die Zeit Reihenfolge cset 2 scheint vor cset 1 begangen worden zu sein. Ich schlage das folgende Verfahren vor: importieren; Pop alle; Drücken, Aktualisieren, Drücken, Aktualisieren, Drücken, Aktualisieren, Alles löschen. Das scheint den Trick zu machen, während progressive Zeitstempel beibehalten werden. –

+0

Mit qrefresh können Sie die Daten für jeden festlegen, was auch immer Sie wollen, also funktioniert jede Methode gleich. –

10

Es gibt --date Flag für hg commit, so überschreiben Sie Commit-Zeit. Die Frage ist, wie man frühere Änderungen ohne Werkzeug sehr schmerzhaft wiedergibt.

Nehmen wir an, Sie die folgende Geschichte der lokalen Commits erhalten:

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

Hier ist meine Lösung:

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 

Sie Anwendung von Patches mit hg patch automatisieren können, die ich noch nicht in meiner Praxis verwendet haben .

+0

Ein einfacher und sauberer Weg. Vielen Dank! –

+3

Sie können einfach "hg strip" verwenden, um die problematische (n) Revision (en) zu entfernen, anstatt zu klonen. – skypher

8

Wenn es nur eine einzige begehen ist, und dass begehen ist die jüngste eine (auf welcher Branche auch immer Sie sind), ein schneller Einzeiler dafür ist:

hg commit --amend -d now