git rebase --committer-date-is-author-date --root 不起作用

Posted

技术标签:

【中文标题】git rebase --committer-date-is-author-date --root 不起作用【英文标题】:git rebase --committer-date-is-author-date --root does not work 【发布时间】:2018-03-05 20:26:41 【问题描述】:

我尝试将最新提交的提交者日期设置为其作者日期。通常这适用于git rebase --committer-date-is-author-date HEAD~1。不幸的是,只有一个提交,这意味着我必须使用 --root 而不是 HEAD~1git rebase --committer-date-is-author-date --root 由于某种原因没有将提交者日期设置为作者日期。我能做什么?

【问题讨论】:

使用 Git 2.19(2018 年第三季度)再次尝试您的 git rebase --committer-date-is-author-date --root:现在应该可以了。见my answer below。 【参考方案1】:

坏消息

不幸的是git rebase --root使用了交互式rebase代码(因为非交互式代码不能“重放”根提交),而--committer-date-is-author-date实际上是一个传递给git am的标志,它实现了简单的非交互式情况.

好消息

git rebase 在基本层面上所做的是 copy 一些提交(通常在复制过程中进行某种更改),然后在最后一个分支名称复制提交。如果你想在复制时更改一个提交,你可以使用git commit --amend 而不是git rebase1 如果整个存储库中只有一个提交,则只能有您需要在复制时更改的一个提交,所以这种情况将适用。

您需要使用GIT_COMMITTER_DATE 变量将提交时间戳设置为任意值,而不是--committer-date-is-author-date。您还可以使用--author 和/或--date 覆盖作者姓名和/或时间戳。因此:

t='2017-09-01 12:34:56'
GIT_COMMITTER_DATE="$t" git commit --amend --date="$t"

将两个时间戳设置为 2017 年 9 月 1 日 12:34:56。 (我在这里使用了一个 shell 变量 t 以避免输入两次相同的时间戳。)

(如果您不想编辑提交消息,请添加--no-edit。请记住,新提交将使用索引中当前的任何内容!如果您在提取 HEAD 提交后更改了索引,您可能想要首先将HEAD 提交复制到临时索引,然后使用它。)


1这假设您要进行的更改是提交消息文本或日期或作者等,而不是提交的父 ID。根提交的定义是没有父 ID,git commit --amend 将继续没有父 ID,这就是您在这种情况下想要的。

【讨论】:

仅供参考:--amend --no-edit --date="..." 听起来像一个用例,通常缩写为 -C sha,其中 SHA 指向我们想要获取作者日期、作者电子邮件和提交的提交 ID。消息.. 不幸的是,-C 没有触及“提交者”部分,因此该部分仍然需要 env 变量【参考方案2】:

git rebase --committer-date-is-author-date --root 出于某种原因没有将提交者日期设置为作者日期。

实际上,它可能会正确设置它,从 Git 23.19 (Q3 2018) 开始

当我们开始将命令从 shell 脚本中移开时,创建的“author-script”文件“git rebase -i”被破坏,现在正在修复。

见commit 5522bba、commit 67f16e3、commit 0f16c09、commit ca3e182(2018 年 7 月 31 日)Eric Sunshine (sunshineco)。(由 Junio C Hamano -- gitster -- 合并到 commit 1bc505b,2018 年 8 月 17 日)

sequencer:修复“rebase -i --root”破坏作者标题时间戳

当“git rebase -i --root”创建一个新的根提交时,它会破坏 “author”标头的时间戳,前面加上“@”:

author A U Thor <author@example.com> @1112912773 -0700

提交解析器对“author”标头的格式非常严格,不允许在该位置出现“@”。

@”来自“rebase-merge/author-script”中的GIT_AUTHOR_DATE, 但是,read_author_ident() 表示基于 Unix 纪元的时间戳,它错误地允许它滑入提交的“author”标头,从而破坏它。

一种可能的解决方法是在构建时过滤掉“@” “author”标头时间戳,但是,更正确的解决方法是解析 GIT_AUTHOR_DATE 日期(通过 parse_date())并格式化解析结果 进入“author”标题。 由于用户可以编辑“rebase-merge/author-script”,因此这种方法具有额外的好处,即可以发现由于手动编辑而导致的其他潜在时间戳损坏。

我们可以做得比自己调用parse_date() 并构造更好 但是,手动“author”标头,而是利用 fmt_ident() 为我们工作。

【讨论】:

git rebase --committer-date-is-author-date --root 打印:fatal: cannot combine am options with either interactive or merge options(git 版本 2.21.0.windows.1)。不过可以预期:git-scm.com/docs/git-rebase#_incompatible_options @40detectives 奇怪:只有与--onto结合使用时才与--root不兼容【参考方案3】:

TL;DR 只需给我一个有效的命令行

git filter-branch --env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"'

【讨论】:

但这不会签署提交。如何修改它以添加GPG签名,例如运行git commit --amend --no-edit -n -S时?

以上是关于git rebase --committer-date-is-author-date --root 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

git rebase

闲谈 git merge 与 git rebase 的区别

git merge和rebase的区别

git rebase 解决 trailing whitespace errors

Git----拉取远程分支,git pull,git rebase,git pull --rebase的区别

Git----拉取远程分支,git pull,git rebase,git pull --rebase的区别