根据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_DATE
和GIT_COMMITTER_DATE
。
有没有办法针对确切的分支/提交执行此操作,因此我不必过滤所有分支?这需要我的一个项目。
答案 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通过从给定名称开始“到达”提交 - 在这种情况下develop
和master
- 并向后工作。前缀hat / caret ^
character意味着“排除这些”,而git filter-branch
只更新它所谓的肯定引用,即名称为“include”而不是名称为“exclude”的名称。所以在filter-branch之后已经复制了要复制的每个提交,它会替换名称develop
,这是一个肯定的引用,但不是名称master
,因为^
前缀 - 是否定的参考。)