GIT: 将提交日期更改为作者日期

GIT: change commit date to author date

是否可以将提交日期从我的提交日期更改为作者日期?

我修改了一些提交,现在日期都一样了。我想将其设置回旧日期(或作者日期)。这可能吗?

我正在使用 Sourcetree,所以我有 git 命令行,但我不是这方面的专家。我的外部存储库是 bitbucket。

因为 git 1.6.3 git rebase--committer-date-is-author-date 用于此目的。

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

原回答:
没有简单的方法来设置 提交者 日期(编辑:但请参阅下面的 "edit 2")。 author 日期很容易调整(在提交时),因为 --date 将允许您在进行时指定每个日期。

环境变量 GIT_COMMITTER_DATE 可用于在您提交时强制使用不同的时间戳。但是请注意,您需要为您 "replay" 的每个提交调整它。生成的新提交将具有不同的 SHA-1(因为您更改了其中的一些位,即提交者日期字段),这意味着您必须重做其所有后代提交。

这就是 git filter-branch 所做的(重新创建一些、许多或所有提交,同时进行更改,保持从旧 SHA-1 ID 到新 SHA-1 ID 的映射并调整甚至其他未触及的提交副本的父级,以便新 SHA-1 ID 的 "new" DAG 以所有可能的方式匹配 "old" DAG,即除了 SHA-1 ID 和任何您的过滤器所做的其他更改)。

换句话说,要做到这一点,你必须用git filter-branch改写历史,这意味着一切。 [编辑:你可以在没有 git filter-branch 的情况下直接执行它,例如,通过在 git rebase -i 中执行它,但效果是一样的。]

编辑 2:正如评论中指出的那样(已删除),git rebase--committer-date-is-author-date 用于此目的。它仍然进行相同的历史重写,但它比使用原始 git filter-branch 命令更方便。

简答:

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

解释:

filter-branch 让您重写您的 git 历史。它可以将转换应用于每个提交或根据特定条件过滤掉提交。有关全面的说明和使用说明,请参阅 git filter-branch --help

--env-filter 允许您设置在创建新历史记录期间存在的环境变量。它针对每个提交分别进行评估。

我想借助 因为我正在寻找一种方法来做到这一点,但有两个区别:

  • 我只想更改当前分支中的提交
  • 我希望对重写的提交进行签名

首先,您需要分支中第一个提交的 ID:

git log master..your-branch-name --pretty="%H" | tail -1

它的输出看起来像这样:c04b195ca1ed4c8a18c6a98d67b8a764a3006afc

获取该 ID 并将其插入以下命令:

git filter-branch -f \
--env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"' \
--commit-filter 'git commit-tree -S "$@";' \
c04b195ca1ed4c8a18c6a98d67b8a764a3006afc^...your-branch-name

每个提交的提交日期和作者日期现在应该匹配。您可以通过 运行 下面的命令仔细检查以轻松查看和比较提交日期值:

git log --format="%H %cI %aI %s" master...your-branch-name