【问题标题】:Change timestamps while rebasing git branch在重新设置 git 分支时更改时间戳
【发布时间】:2010-12-07 11:16:27
【问题描述】:

在将要公开之前,我已经在分支中重新组织了提交,导致提交的时间戳处于混乱的顺序。我宁愿他们都在今天,中间只有几秒钟。

显然这些时间戳也不正确,但由于这是事情公开的时间,我更喜欢它而不是混乱的历史,时间方面。

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

【问题讨论】:

  • 使用 Git 2.29(2020 年第四季度),git rebase --root-i--reset-author-date 将起作用。见my answer below

标签: git git-rebase


【解决方案1】:

使用--ignore-date:

git rebase --ignore-date

【讨论】:

  • 我在发布之前已经尝试过了。除了我没有交互式地完成它,也许这就是诀窍?另外,您是否尝试过 --committer-date-is-author-date 别名?可能是--ignore-date 是在后来的版本中引入的,我不知道。
  • 是的,如果以非交互方式完成,它可以工作。但是然后 - 与 rebase 一样 - 第一次提交不受影响。
  • @MichaelKrelin-hacker:根据文档, --ignore-date 这些标志被传递给 git am 以轻松更改重新提交的日期(参见 git-am[1] )。与 --interactive 选项不兼容。
  • @Tim 根提交没有父提交,当我问这个问题时,我还想更改该提交的日期。现在我们有了--root,这使这成为可能。
  • Incompatible with the --interactive option. See docs
【解决方案2】:

在我的例子中,将时间戳更改为 CommitDate 值,因此在 gitweb 中,一堆几个月前的提交显示为 4 天前。我找到了正确日期的最后一次提交并做了:

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

【讨论】:

  • 不,不是。事实上,情况恰恰相反。来自git rebase 的文档:“这些标志被传递给git am 以轻松更改重新定位提交的日期”。在git am 它说:--committer-date-is-author-date[...]允许用户通过使用与作者日期相同的值来谎报提交者日期”而--ignore-date [...]允许用户通过使用与提交者日期相同的值来谎报作者日期“。
【解决方案3】:

有以下几种方式

  1. 普通变基

    git rebase --ignore-date
    
  2. 交互式变基

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

【讨论】:

  • 感谢上帝提供了一种易于理解的方式来完成任何类型的变基工作!谢谢!从现在开始,我将使用--date=new每次使用--amend。 IMO、交互式 rebase 中的任何 squashfixup 以及任何 commit --amend 都应自动更新时间戳 now 或至少更新到最新组合提交的日期。我认为不能合理地争论合并的提交应该与被合并的第一个提交具有相同的时间戳,好像从那时起没有任何变化,但这就是我们今天所拥有的。
【解决方案4】:

来自 cmets:

--interactive option不兼容

实际上...它不再与 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 日)和 Rohit Ashiwal (r1walz)commit ef484ad(2020 年 7 月 13 日)。
请参阅Phillip Wood (phillipwood)commit a3894aacommit 7573ceccommit e8cbe21(2020 年 8 月 17 日)。
(由 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:

不要使用当前时间作为提交者日期,而是使用 提交的作者日期被重新设置为提交者 日期。
此选项暗示--force-rebase

git rebase 还包含在其man page 中:

--ignore-date:

这个标志被传递给'git am'来改变作者日期 每个 rebase 提交(参见 git am)。


请注意,在 2.29(上)中,“rebase”和“am”子命令的“--committer-date-is-author-date”选项错误地丢失了电子邮件地址,已在 Git 2.29.1(Q4 2020)。

参见Jeff King (peff)commit 5f35eddcommit 16b0bb9commit 56706db(2020 年 10 月 23 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit f34687d,2020 年 10 月 26 日)

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

签字人:杰夫·金

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

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

此提交修复了这两个问题,这导致我们通过变基“apply”后端对此选项的测试现在成功。

还有:

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

报告人:VenomVendor
签字人:Jeff King

Commit 7573cec52c ("rebase -i: support --committer-date-is-author-date", 2020-08-17, Git v2.29.0-rc0 -- merge 列在batch #13)从builtin/am.c 复制提交者身份解析代码。
在这样做的过程中,它复制了一个错误,即我们总是将电子邮件设置为空字符串。

我们在上一次提交中修复了git-am 中的版本;此提交修复了复制的代码。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2019-06-08
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多