更改git上特定上一次提交的GIT_AUTHOR_DATE / GIT_COMMITTER_DATE日期

时间:2017-03-24 18:00:46

标签: git

根据this post,建议执行以下操作:

git filter-branch --env-filter \
    'if [ $GIT_COMMIT = <commit hash here> ]
     then
         export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
         export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
     fi'

更改先前提交的GIT_AUTHOR_DATEGIT_COMMITTER_DATE

有没有办法针对确切的分支/提交执行此操作,因此我不必过滤所有分支?这需要我的一个项目。

1 个答案:

答案 0 :(得分:1)

过滤器 定位确切的提交(并且仅在当前分支上运行)。您可以限制它在其他(较早)点停止复制;如果提交接近分支提示,那将有助于加快速度。请记住,当前分支包含可从其提示访问的每个提交,即使这些提交位于其他分支上。例如:

...--o--o--*--o--o--o   <-- master
            \
             o--o   <-- develop (HEAD)

此处develop上有两个的提交,master上只有 的三个提交,以及许多(至少三个) ,以及两个分支上的...代表的任何内容),最近的那些是提交*

如果您知道提交*的哈希ID,则可以写:

git filter-branch --env-filter \
    [snip actual filter] \
    HEAD ^<hash>

告诉Git在达到提交*后停止向后遍历;或者您可以使用更简单的方法:

git filter-branch --env-filter \
    [snip actual filter] \
    HEAD ^master

这排除了所有三个master - 仅过滤提交,以及提交*及更早版本。这是非常安全的,因为它们已经不是动作的一部分:我们只使用名称master作为快捷方式来识别master 可以访问的所有提交(所以我们只保留可从develop到达的提交,而不是两个名称都可以访问的提交。

(请记住,Git通过从给定名称开始“到达”提交 - 在这种情况下developmaster - 并向后工作。前缀hat / caret ^ character意味着“排除这些”,而git filter-branch只更新它所谓的肯定引用,即名称为“include”而不是名称为“exclude”的名称。所以在filter-branch之后已经复制了要复制的每个提交,它会替换名称develop,这是一个肯定的引用,但不是名称master,因为^前缀 - 是否定的参考。)