git rebase而不更改提交时间戳

git rebase without changing commit timestamps

在保留提交时间戳的同时执行git rebase是否有意义?

我认为结果是,新的分支机构不一定按时间顺序有提交日期。这在理论上是可能的吗?(例如,使用管道命令;只是好奇)

如果理论上是可行的,那么在实践中是否可以使用REBASE,而不是更改时间戳?

例如,假设我有以下树:

1
2
3
4
5
6
7
master <jun 2010>
  |
  :
  :
  :     oldbranch <feb 1984>
  :     /
oldcommit <jan 1984>

现在,如果我在master上对oldbranch进行再平衡,承诺日期从1984年2月改为2010年6月。是否可以更改该行为,以便不更改提交时间戳?最后,我将获得:

1
2
3
4
5
      oldbranch <feb 1984>
      /
 master <jun 2010>
    |
    :

这有道理吗?在Git中,是否允许有一个历史记录,其中旧提交作为父级具有较新提交?


Update June 2014:David Fraser mentions in the comments a solution also detailed in"change timestamps while rebasing git branch",using the option --committer-date-is-author-date(introduced initially in Jan.2009 in commit 3F01AD6)

Note that the --committer-date-is-author-date option seems to leave the author timestamp, and set the committer timestamp to be the same as the original author timestamp, which is what the OP Olivier Verdier wanted.

I found the last commit with the correct date and did:

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

See git am

ZZU1BLCK1/

(原始答案,2012年6月)

你可以尝试,为了一个不交互的反抗

1
git rebase --ignore-date

(From this so answer)

This is passed to git am,which mentions:

1
 --ignore-date

By default the command records the date from the e-mail message as the commit author date, and uses the time of commit creation as the committer date.
This allows the user to lie about the author date by using the same value as the committer date.

此选项"与交互选项不相容"。

既然你可以改变旧的日期(用EDOCX1&4),我猜你可以用你想要/需要的日期来组织你的GIT历史,即使是为了将来!页:1

如奥利维尔在他的问题中所说的,权威的日期从未改变过。From the Pro Git Book:

  • The author is the person who originally wrote the work,
  • whereas the committer is the person who last applied the work.

So, if you send in a patch to a project and one of the core members applies the patch, both of you get credit.

To be extra clear,in this instance,as Olivier comments:

the --ignore-date does the opposite of what I was trying to achieve!
Namely, it erases the author's timestamp and replace them with the commits timestamps!
So the right answer to my question is:
Do not do anything, since git rebase does actually not change authors' timestamps by default.


如果你已经将委员会的日期(或与一个反叛分子的日期)拼凑起来,并希望将它们重新安排到相应的日期,你可以:

法国电力公司


一个关键的问题是冯·C帮助我了解你背叛的时候会发生什么:当你背叛的时候,承诺的时刻会发生变化,但权威的时刻不会发生变化,这一切都是有意义的。所以我的问题其实还不够准确

答案是,反叛分子实际上并不改变作者的时刻(你不需要为这个做任何事情),这一切都是完美的。


反叛者将在时机成熟新的承诺是创立的,但权威的时刻保持完整。大部分时间这是渴望的行为,但在某些场景中,我们不希望改变。The Committer's timestamp either.我们怎样才能做到这一点?这里是我通常都这么做。

首先,让每一个人都确信你对复仇的感觉是独一无二的如同信息和权威的时刻(这是作弊需要改进的地方,目前这正是我的需要所在)。

在叛乱之前,记录承诺的时间,作者的时间,并将所有承诺的信息转达给一个文件。

1
2
#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog

然后,让真实的叛逆者占据位置。

最后,如果使用EDOCX1〕〔4〕所传达的信息是相同的,我们将当前承诺的时刻记录在文件中。

1
 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/

再说一遍,你可以做类似的事情

举例来说,如果权威机构的时机已不复存在,我们只是想让作者有时间在这里表演Order,then the following commands will help.

1
2
3
4
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'