【发布时间】:2010-10-09 18:33:44
【问题描述】:
如何更改我在本地存储库中提交的时间?
假设我已经完成了几次提交并注意到我计算机上的日期是错误的。还假设这些提交还没有被推送到任何地方。
【问题讨论】:
标签: mercurial repository commit
如何更改我在本地存储库中提交的时间?
假设我已经完成了几次提交并注意到我计算机上的日期是错误的。还假设这些提交还没有被推送到任何地方。
【问题讨论】:
标签: mercurial repository commit
如果它只是一次提交,并且该提交是最近的一次(在您所在的任何分支上),那么执行此操作的快速单线是:
hg commit --amend -d now
【讨论】:
您可以使用 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 <ry4an@mini>
date: Thu Dec 03 00:00:00 2009 -0600
summary: third
changeset: 1:c1fe70008824
user: Ry4an Brase <ry4an@mini>
date: Wed Dec 02 00:00:00 2009 -0600
summary: second
changeset: 0:abb97adaa541
user: Ry4an Brase <ry4an@mini>
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 <ry4an@mini>
date: Wed Feb 25 22:29:01 2009 -0600
summary: third
changeset: 1:5cbb9fc51bcc
user: Ry4an Brase <ry4an@mini>
date: Wed Feb 25 22:29:02 2009 -0600
summary: second
changeset: 0:ec58d1f24278
user: Ry4an Brase <ry4an@mini>
date: Wed Feb 25 22:29:02 2009 -0600
summary: first
【讨论】:
-d而不是-D,如果您希望订单与日期顺序匹配,请手动指定日期。
hg commit 有 --date 标志,这是您覆盖提交时间的方式。问题是如何在没有太多痛苦的情况下重新提交早期的更改。
假设您获得以下本地提交历史记录:
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
【讨论】: