如何更改提交时间(尚未推送)?

时间:2009-02-25 09:10:51

标签: mercurial repository commit

如何更改我在本地存储库中提交的时间?

假设我已完成多次提交,并注意到我计算机上的日期错误。假设这些提交还没有推到任何地方。

4 个答案:

答案 0 :(得分:11)

您可以使用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

答案 1 :(得分:10)

--datehg 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自动应用补丁。

答案 2 :(得分:10)

如果它只是一次提交,并且该提交是最新的提交(在你正在使用的任何分支上),那么这样做的快速单行程序是:

hg commit --amend -d now

答案 3 :(得分:1)

使用hg&#39; graftstrip似乎是使用MQ /补丁/进化的更简单的替代方法。

使用此方法,您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