我尝试将最新提交的提交者日期设置为其作者日期。通常这适用于git rebase --committer-date-is-author-date HEAD~1
。不幸的是,只有一个提交意味着我必须使用--root
而不是HEAD~1
,但git rebase --committer-date-is-author-date --root
由于某种原因未将提交日期设置为作者日期。我该怎么办?
答案 0 :(得分:6)
“ TL; DR只给我一个有效的命令行”版:
git filter-branch --env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"'
答案 1 :(得分:3)
不幸的是git rebase --root
使用交互式rebase代码(因为非交互式代码不能"重放"根提交),--committer-date-is-author-date
实际上是传递给{{1实现简单的非交互式案例。
git am
在基本层面上做的是复制一些提交(通常是在复制过程中进行某种更改),然后将分支名称指向最后这样复制的提交。如果只有一个提交要进行复制,则可以使用git rebase
而不是git commit --amend
。 1 如果整个存储库中只有一个提交,
您需要使用git rebase
变量将提交时间戳设置为某个任意值,而不是--committer-date-is-author-date
。您还可以使用GIT_COMMITTER_DATE
和/或--author
覆盖作者姓名和/或时间戳。因此:
--date
将时间戳设置为2017年9月1日12:34:56。 (我在这里使用了一个shell变量t='2017-09-01 12:34:56'
GIT_COMMITTER_DATE="$t" git commit --amend --date="$t"
来避免两次输入相同的时间戳。)
(如果您不想编辑提交消息,请添加t
。请记住,新提交将使用索引中当前的任何内容!如果您在提取HEAD提交后更改了索引,您可能希望首先将--no-edit
提交复制到临时索引,然后使用它。)
1 这假定您要进行的更改是,例如,提交消息文本或日期或作者或某些此类,而不是提交的父ID。根提交的定义是没有父ID的定义,HEAD
将继续没有父ID,这就是你想要的。
答案 2 :(得分:2)
但是出于某种原因,
git rebase --committer-date-is-author-date --root
并未将提交者日期设置为作者日期。
实际上,从Git 23.19(2018年第三季度)开始,它可能会正确设置
“ author-script
”文件“ git rebase -i
”创建失败,因为我们开始将命令从现在已修复的Shell脚本移开。
请参见commit 5522bba的commit 67f16e3,commit 0f16c09,commit ca3e182,Eric Sunshine (sunshineco
)(2018年7月31日)。
(由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
”标头的格式非常严格,并且不允许在该位置使用“@
”。“
@
来自“GIT_AUTHOR_DATE
”中的rebase-merge/author-script
, 但是,read_author_ident()
表示基于Unix纪元的时间戳,因此错误地使其滑入了提交的“author
”标头,从而破坏了它。一种可能的解决方法是在构造时仅过滤掉“
@
” “author
”标题时间戳,但是,更正确的解决方法是解析GIT_AUTHOR_DATE
日期(通过parse_date()
)并设置解析结果的格式 放入“author
”标题中。
由于用户可以编辑“rebase-merge/author-script
”,因此这种方法具有捕获由于手工编辑而导致的其他潜在时间戳损坏的额外好处。我们可以做得比自己打电话
parse_date()
并构建 但是,通过手动利用“author
”标题fmt_ident()
对我们有用。