Ответов (4)4
Вы можете легко сделать это с помощью MQ (Mercurial Queues):
Настройте репо с плохой датой
+ 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
Превратите ревизии в патчи в очереди
+ hg qimport -r 2
+ hg qimport -r 1
+ hg qimport -r 0
Сделайте каждый патч qtip по очереди и зафиксируйте дату
+ hg qrefresh -D
+ hg qpop
Now at: 1.diff
+ hg qrefresh -D
+ hg qpop
Now at: 0.diff
+ hg qrefresh -D
Повторно примените патчи
+ hg qpush
applying 1.diff
Now at: 1.diff
+ hg qpush
applying 2.diff
Now at: 2.diff
Превратите каждый патч обратно в реальный набор изменений
+ hg qdel -r 0
+ hg qdel -r 1
+ hg qdel -r 2
Все лучше:
+ 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
Есть --date
флаг для того hg commit
, как вы перезаписываете время фиксации. Вопрос в том, как повторно подтвердить ранее внесенные изменения без особых усилий.
Предположим, вы получили следующую историю локальных коммитов:
dir1> hg commit # r100, OK
dir1> hg commit # r101, need to fix time
dir1> hg commit # r102, need to fix time
Вот мое решение:
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
Вы можете автоматизировать применение патчей, hg patch
которыми я еще не пользовался в своей практике.
Использование hg graft
и strip
кажется более простой альтернативой использованию MQ / patches / evolve.
С помощью этого метода вы graft
совершаете фиксацию на вторую дублирующую ветку (при использовании функции изменения даты graft
). А затем оттуда вы можете просто strip
вернуть ветку с плохими датами .. Скажем, вы случайно создали несколько коммитов с плохими датами, и ваша история выглядит как на графике ниже:
> hg log -GT'{rev}:{desc} ({date|isodatesec})'
@ 8:good commit (2018-03-18 20:13:07 2018 -0500)
|
o 7:erroneous commit two (2018-12-01 00:00:00 2018 -0600)
|
o 6:erroneous commit one (2018-12-01 00:00:00 2018 -0600)
|
o 5:commit before you started commiting bad dates
Чтобы исправить это, просто обновите последнюю хорошую ревизию перед ошибочной фиксацией, а затем скопируйте фиксации в новую (анонимную) ветку, используя graft
:
> hg up 5
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
> hg graft -D -r6 -r7 -r8
> hg log -GT'{rev}:{desc} ({date|isodatesec})'
@ 11:good commit (2018-03-18 20:14:48 2018 -0500)
|
o 10:erroneous commit two (2018-03-18 20:14:48 2018 -0500)
|
o 9:erroneous commit one (2018-03-18 20:14:48 2018 -0500)
|
| o 8:good commit (2018-03-18 20:13:07 2018 -0500)
| |
| o 7:erroneous commit two (2018-12-01 00:00:00 2018 -0600)
| |
| o 6:erroneous commit one (2018-12-01 00:00:00 2018 -0600)
|/
o 5:commit before you started commiting bad dates
Теперь у вас есть две идентичные ветки с одинаковыми коммитами, но с разными датами. Итак, теперь вам просто нужно вернуть свою линейную историю, используя strip
старую ветку:
> hg strip -r6 -r7 -r8
saved backup bundle to /home/miles/repo/.hg/strip-backup/ac1973513844-a8f5244e-backup.hg
> hg log -GT'{rev}:{desc} ({date|isodatesec})'
@ 8:good commit (2018-03-18 20:14:48 -0500)
|
o 7:erroneous commit two (2018-03-18 20:14:48 -0500)
|
o 6:erroneous commit one (2018-03-18 20:14:48 -0500)
|
o 5:commit before you started commiting bad dates