在重新设置 Git 分支时更改时间戳

136

在一个分支将要发布之前,我重新组织了提交记录,导致提交记录的时间戳顺序混乱。我希望它们都是今天的,时间只间隔几秒钟。

显然,这些时间戳也不会正确,但由于这是公开的时间,我更喜欢所有提交记录在时间上都是一致的,而不是混乱的历史记录。

那么,在变基时如何告诉git创建新的时间戳?


2
在 Git 2.29(2020 年第四季度)中,git rebase --root-i 命令与 --reset-author-date 参数一起使用将会生效。请参见我的回答 - VonC
4个回答

183

2
在发布之前,我已经尝试过了。除了我没有交互式地完成它,也许这就是诀窍?另外,你尝试过--committer-date-is-author-date别名吗?也许--ignore-date是在后来的版本中引入的,我不知道。 - Michael Krelin - hacker
2
是的,如果以非交互方式完成,则可行。但是像重新定位一样 - 第一个提交始终不受影响。 - tarsius
3
根据文档,_--ignore-date_ 这个标志是传递给 git am 命令的,可以方便地更改被变基提交的日期(参见 git-am[1])。该选项与 --interactive 不兼容。 - Tim
4
根提交没有父级,当我提出这个问题时,我还想更改该提交的日期。现在我们有了 --root,可以实现这一点。 - tarsius
5
无法与--interactive选项兼容。参见文档 - Vlastimil Ovčáčík
显示剩余11条评论

33

以下是几种方法:

  1. 普通变基

git rebase --ignore-date
  • 交互式变基

    git rebase -i master
    git commit --amend --date=now
    git push origin <branch> -f
    

  • 感谢上帝提供了一种易于理解的方式来完成任何类型的变基工作!谢谢!从现在开始,我将每次使用--amend时都使用--date=new。在我的看法中,在交互式变基中进行任何squashfixup以及任何commit --amend都应该自动更新时间戳为“现在”或至少是组合提交中最近日期的日期。我认为不能合理地认为组合提交应具有与组合的第一个提交相同的时间戳,就好像自那时以来什么也没有改变一样,但这就是我们今天所拥有的。 - Pablo Halpern

    30

    在我的情况下,变基操作将时间戳更改为CommitDate的值,因此在gitweb中,一堆几个月前的提交显示为4天前。我找到了最后一个具有正确日期的提交并执行了以下操作:

    $ git rebase --committer-date-is-author-date SHA
    

    40
    不,实际上恰恰相反。从git rebase的文档中可以看到:“这些标志将传递给git am以轻松更改重新贴基的提交日期”。在git am中它说:--committer-date-is-author-date“[...]允许用户通过使用与作者日期相同的值来欺骗提交者日期”,而--ignore-date“[...]允许用户通过使用与提交者日期相同的值来欺骗作者日期”。 - Enrico Campidoglio

    14

    来自评论:

    --interactive选项不兼容

    实际上...从Git 2.29(2020年第四季度)开始,它不再与之不兼容: "git rebase -i"(man)学习了更多选项
    与以下选项兼容的选项:

    • --interactive/-i
    • --root

    请参见commit 6160b2e(2020年8月26日)由Junio C Hamano(gitster提交。
    请参见commit 2712669(2020年8月17日)和commit ef484ad(2020年7月13日)由Rohit Ashiwal(r1walz提交。
    请参见commit a3894aa, commit 7573cec, commit e8cbe21(2020年8月17日)由Phillip Wood(phillipwood提交。
    (由Junio C Hamano -- gitster --合并于commit 9c31b19,2020年9月3日)

    rebase -i:支持--ignore-date

    原始补丁来自:Rohit Ashiwal
    签署者:Phillip Wood

    rebase有两种不同的后端实现——'apply'和'merge',每个后端都支持不同的选项。

    特别是,应用后端支持一些由'git am(man)'实现的选项,而合并后端则不支持这些选项。
    这意味着可用的选项取决于使用哪个后端,这很令人困惑。

    此补丁为合并后端添加了对--ignore-date选项的支持。

    此选项使用当前时间作为作者日期,而不是在重写提交时重用原始作者日期。
    我们会像应用后端一样小心处理--ignore-date--committer-date-is-author-date的组合。

    rebase: 添加 --reset-author-date

    帮助者:Junio C Hamano
    签名作者:Rohit Ashiwal

    之前的提交引入了 --ignore-date 标志到 rebase -i,但是名称相当模糊,因为它没有说明是忽略作者日期还是提交者日期。
    添加一个别名以传达精确的目的。

    --reset-author-date

    rebase -i: 支持 --committer-date-is-author-date

    原始补丁由:Rohit Ashiwal 提供
    签名作者:Phillip Wood

    此补丁为合并后端添加了支持 --committer-date-is-author-date 选项。
    该选项使用正在重写的提交的作者日期作为创建新提交时的提交者日期。

    git rebase现在在其man page中包含:

    --committer-date-is-author-date:

    使用被rebase的提交的作者日期作为提交者日期,而不是使用当前时间作为提交者日期。
    此选项意味着--force-rebase

    git rebase还在其man page中包含:

    --ignore-date:

    将此标志传递给'git am'以更改每个rebased提交的作者日期(请参见git am)。


    请注意,在2.29版本(以上),"rebase"和"am"子命令的"--committer-date-is-author-date"选项错误地丢失了电子邮件地址,这在Git 2.29.1(2020年第四季度)中已得到修正。
    请参见commit 5f35eddcommit 16b0bb9commit 56706db(2020年10月23日),由Jeff King (peff)提交。
    (由Junio C Hamano -- gitster --合并于commit f34687d,2020年10月26日)

    am:通过 --committer-date-is-author-date 修复破损的电子邮件

    签名:Jeff King

    提交 e8cbe2118a (am: 停止导出 GIT_COMMITTER_DATE, 2020-08-17) 重写了设置提交者日期的代码,使用 fmt_ident() 而不是设置环境变量并让 commit_tree() 处理它。
    但它引入了两个错误:

    • 我们使用作者电子邮件字符串而不是提交者电子邮件
    • 在解析提交者标识时,我们使用了错误的变量来计算电子邮件的长度,导致其始终为零长度字符串

    这个提交修复了这两个问题,使我们通过基于补丁的 "apply" 后端测试此选项现在成功了。

    rebase: 使用 --committer-date-is-author-date 修复破损的电子邮件

    报告人:VenomVendor
    签署者:Jeff King

    提交 7573cec52c (“rebase -i:支持--committer-date-is-author-date”,2020年8月17日,Git v2.29.0-rc0 -- 在批次 #13中列出合并)复制了builtin/am.c中的提交者标识解析代码。
    在这样做时,它复制了一个错误,即我们始终将电子邮件设置为空字符串。

    我们在之前的提交中修复了git-am版本; 这个提交修复了复制的代码。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接