使用git filter-branch重写作者/提交者并同时提交消息

时间:2010-07-28 16:17:29

标签: git scripting git-svn dvcs git-filter-branch

我有一个最初从Subversion导入的Git存储库。作者/提交者信息的一部分是错误的,这不是Git的错,但主要是由于对Subversion的草率提交。

我想使用git filter-branch重写存储库的历史记录,修复提交者和作者信息。

问题是......我需要从提交消息中剔除作者信息。据我所知,git filter-branch允许您过滤和更改作者信息(使用--env-filter)和/或过滤提交消息(使用--msg-filter),但同时执行这两项操作,并在不同过滤器之间共享信息。

所以我对如何做到这一点感到困惑......我能想到的最好的方法是多次传递:首先,收集allllll提交消息,然后制作一个脚本来完成并过滤所有作者/提交者信息。这看起来非常不优雅且容易出错,所以我想知道是否有其他人已经想出更顺利地完成这类工作。

1 个答案:

答案 0 :(得分:4)

我能想到的唯一一件事就是使用提交过滤器。与消息过滤器一样,它在stdin上获取日志消息,因此您将能够解析它并找出您需要的内容。然后,您可以自己设置相应的变量并自己调用git commit-tree。 (提交过滤器本质上是commit-tree的替代品,采用相同的参数并生成相同的输出。)

在bash中,它会是这样的:

message=$(read_from_stdin)

modify_env_vars "$message"

echo "$message" | git commit-tree "$@"

我从来没有尝试过这个,但我不明白为什么它不会起作用,假设你正确编写了这两个shell函数!

(只是一个小小的注释 - 并不是--env-filter--msg-filter不能相互影响,而是它们总是以那个顺​​序运行。所以,第一个过滤器可以在文件或环境中留下副作用,让对方看到,但它们的顺序让你无法做你想做的事。)