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
是否可以将提交日期从我的提交日期更改为作者日期?
我修改了一些提交,现在日期都一样了。我想将其设置回旧日期(或作者日期)。这可能吗?
我正在使用 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