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~1
但 git 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 rebase
。1 如果整个存储库中只有一个提交,则只能有您需要在复制时更改的一个提交,所以这种情况将适用。
您需要使用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 解决 trailing whitespace errors