“TL;DR 只是给我一个有效的命令行”版本:
git filter-branch --env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"'
不幸的是git rebase --root使用交互式 rebase 代码(因为非交互式代码无法“重放”根提交),--committer-date-is-author-date实际上是传递给 的标志git am,它实现了简单的非交互式情况。
是什么git rebase呢,在最基本的层面,是复制一些提交(有,通常情况下,某种在复制过程中做出改变),再点一个分支的名字在最后的这种复制的承诺。如果您只想在复制时更改一次提交,则可以使用git commit --amend代替git rebase。1 如果整个存储库中只有一个提交,则只能在复制时更改一个提交,因此将适用这种情况。
而不是--committer-date-is-author-date,您将需要使用该GIT_COMMITTER_DATE变量将提交时间戳设置为某个任意值。您还可以使用--author和/或--date覆盖作者姓名和/或时间戳。因此:
t='2017-09-01 12:34:56'
GIT_COMMITTER_DATE="$t" git commit --amend --date="$t"
Run Code Online (Sandbox Code Playgroud)
会将两个时间戳设置为 2017 年 9 月 1 日 12:34:56。(我t在这里使用了一个 shell 变量来避免两次输入相同的时间戳。)
(--no-edit如果您不想编辑提交消息,请添加。请记住,新提交将使用索引中当前的任何内容!如果您在提取 HEAD 提交后更改了索引,您可能需要将HEAD提交复制到临时首先索引,然后使用它。)
1这假设您要进行的更改是,例如,提交消息文本或日期或作者等,而不是提交的父 ID。根提交的定义是没有父 ID 的,并且git commit --amend将继续没有父 ID,这就是您在这种情况下想要的。
但
git rebase --committer-date-is-author-date --root由于某种原因没有将提交者日期设置为作者日期。
实际上,从 Git 23.19(2018 年第 3 季度)开始,它可能会正确设置
当我们开始将命令从 shell 脚本移开时,创建的“author-script文件”git rebase -i被破坏,现在正在修复。
请参阅Eric Sunshine ( )的提交 5522bba、提交 67f16e3、提交 0f16c09、提交 ca3e182(2018 年 7 月 31 日)。(由Junio C Hamano 合并 -- --在提交 1bc505b中,2018 年 8 月 17 日)sunshineco
gitster
sequencer:修复“rebase -i --root”损坏的作者标题时间戳当“
git rebase -i --root”创建新的根提交时,它会author通过在前面添加“”来破坏“”标头的时间戳@:Run Code Online (Sandbox Code Playgroud)author A U Thor <author@example.com> @1112912773 -0700提交解析器对“”标头的格式非常严格
author,并且不允许@在该位置出现“”。“
@”来自GIT_AUTHOR_DATE“rebase-merge/author-script”,表示基于 Unix 纪元的时间戳,但是read_author_ident()错误地允许它滑入提交的“author”标头,从而损坏了它。
@一种可能的修复方法是在构造“ ”标头时间戳时简单地过滤掉“ ”author,但是,更正确的修复方法是解析GIT_AUTHOR_DATE日期(通过parse_date())并将解析结果格式化为“author”标头。
由于“rebase-merge/author-script”可能由用户编辑,因此此方法具有捕获由于手动编辑而导致的其他潜在时间戳损坏的额外好处。
parse_date()然而,我们可以比调用自己并手动构造“ ”标头做得更好author,而是利用fmt_ident()它为我们工作。