为了账号安全,请及时绑定邮箱和手机立即绑定

git rebase而不更改提交时间戳

git rebase而不更改提交时间戳

Git
慕的地8271018 2019-10-15 09:54:53
git rebase在保留提交时间戳的同时执行是否有意义?我认为后果是新分支不一定按时间顺序排列提交日期。从理论上讲这完全可能吗?(例如,使用管道命令;只是在这里感到好奇)如果理论上可行,那么实践中是否有可能重新设置基准而不更改时间戳?例如,假设我有以下树:master <jun 2010>  |  :  :  :     oldbranch <feb 1984>  :     /oldcommit <jan 1984>现在,如果我oldbranch依据的话master,提交的日期将从1984年2月更改为2010年6月。是否可以更改该行为,以便不更改提交时间戳记?最后,我将获得:      oldbranch <feb 1984>      / master <jun 2010>    |    :那完全有意义吗?甚至在git中允许有一个历史记录,其中旧提交作为父提交具有较新的提交?
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

David Fraser 在评论中提到了一种解决方案,该解决方案在“ 使用git分支更改基础时更改时间戳 ”中也有详细--committer-date-is-author-date介绍,使用了该选项(最初于2009年1月在commit 3f01ad6中引入


请注意,该--committer-date-is-author-date选项似乎保留了作者时间戳,并将提交者时间戳设置为与原始作者时间戳相同,这是OP Olivier Verdier想要的。


我找到了正确日期的最后一次提交,并做到了:


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

见git am:


--committer-date-is-author-date

默认情况下,该命令将电子邮件中的日期记录为提交作者日期,并将提交创建的时间用作提交者日期。

这允许用户使用与作者日期相同的值来确定提交者日期。


(原始答案,2012年6月)


你可以尝试,对于非交互式的rebase


git rebase --ignore-date

(从这个SO答案)


这传递给git am,其中提到:


 --ignore-date

默认情况下,该命令将电子邮件中的日期记录为提交作者日期,并将提交创建的时间用作提交者日期。

这允许用户通过使用与提交者日期相同的值来说谎关于作者日期。


对于git rebase,此选项为“与--interactive选项不兼容”。


由于您可以随意更改旧提交日期的时间戳记(带有git filter-branch),因此我想您可以按照想要/需要的任何提交日期顺序来组织您的Git历史记录,甚至可以将其设置为将来!。


正如奥利维尔(Olivier)在他的问题中提到的那样,作者的日期永远不会因更改基准而改变。

从Pro Git书中:


作者是最初撰写作品的人,

而提交者是最后应用该作品的人。

因此,如果您向项目发送补丁程序,并且其中一个核心成员应用了补丁程序,那么你们两个都将获得荣誉。


在这种情况下,要更加清楚,正如奥利维尔(Olivier)所说:


这--ignore-date与我要实现的目标相反!

即,它将删除作者的时间戳,并用提交时间戳替换它们!

因此,对我的问题的正确答案是:

不要执行任何操作,因为git rebase 默认情况下实际上不会更改作者的时间戳。


查看完整回答
反对 回复 2019-10-15
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

默认情况下,git rebase会将提交者的时间戳设置为创建新提交时的时间,但保持作者的时间戳不变。大多数时候,这是期望的行为,但是在某些情况下,我们也不想更改提交者的时间戳。我们怎样才能做到这一点?好吧,这是我通常做的把戏。


首先,确保您将要重新建立基础的每个提交都具有唯一的提交消息和作者时间戳(这是技巧需要改进的地方,尽管目前可以满足我的需要)。


在重新设置基准之前,请记录提交者的时间戳,作者的时间戳以及所有将基于文件的提交的提交消息。


#NOTE: BASE is the commit where your rebase begins

git log --pretty='%ct %at %s' BASE..HEAD > hashlog

然后,进行实际的变基。


最后,如果使用提交消息相同,则用文件中记录的时间戳替换当前提交者的时间戳git filter-branch。


 git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'

如果出了什么问题,只需结帐git reflog或所有refs/original/参考。


此外,您可以执行与作者的时间戳类似的操作。


例如,如果作者的某些提交时间戳不正确,并且没有重新排列这些提交,我们只希望作者的时间戳按顺序显示,那么以下命令将有所帮助。


git log --pretty='%at %s' COMMIT1..COMMIT2 > hashlog

join -1 1 -2 1 <(cat hashlog | cut -f 1 | sort -nr | awk '{ print NR" "$1 }') <(cat hashlog | awk '{ print NR" "$0 }') | cut -d" " -f2,4- > hashlog_

mv hashlog_ hashlog

git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_AUTHOR_DATE=$__date || cat'


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 2159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信