【问题标题】:How do I change commit time (not pushed yet)?如何更改提交时间(尚未推送)?
【发布时间】:2010-10-09 18:33:44
【问题描述】:

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

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

【问题讨论】:

    标签: mercurial repository commit


    【解决方案1】:

    如果它只是一次提交,并且该提交是最近的一次(在您所在的任何分支上),那么执行此操作的快速单线是:

    hg commit --amend -d now
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 一种很好的原生方式(尽管需要了解 MQ)。谢谢!
      • 这反转了 cset 2 似乎在 cset 1 之前提交的时间顺序。我建议以下程序:导入;全部弹出;推送,刷新,推送,刷新,推送,刷新,全部删除。这似乎在保留渐进式时间戳的同时起到了作用。
      • 您可以使用 qrefresh 将每个日期设置为您想要的任何日期,因此实际上这两种方法的工作原理相同。
      • @AlanFranzoni:使用-d而不是-D,如果您希望订单与日期顺序匹配,请手动指定日期。
      【解决方案3】:

      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 strip”来删除有问题的修订版而不是克隆。
      【解决方案4】:

      使用 hg 的 graftstrip 似乎比使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-22
        • 2014-10-28
        • 2011-04-27
        • 2021-09-14
        • 2011-02-15
        • 1970-01-01
        • 2013-02-13
        • 2012-03-25
        相关资源
        最近更新 更多