我有一个最初从Subversion导入的Git存储库。作者/提交者信息的一部分是错误的,这不是Git的错,但主要是由于对Subversion的草率提交。
我想使用git filter-branch
重写存储库的历史记录,修复提交者和作者信息。
问题是......我需要从提交消息中剔除作者信息。据我所知,git filter-branch
允许您过滤和更改作者信息(使用--env-filter
)和/或过滤提交消息(使用--msg-filter
),但不同时执行这两项操作,并在不同过滤器之间共享信息。
所以我对如何做到这一点感到困惑......我能想到的最好的方法是多次传递:首先,收集allllll提交消息,然后制作一个脚本来完成并过滤所有作者/提交者信息。这看起来非常不优雅且容易出错,所以我想知道是否有其他人已经想出更顺利地完成这类工作。
答案 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
不能相互影响,而是它们总是以那个顺序运行。所以,第一个过滤器可以在文件或环境中留下副作用,让对方看到,但它们的顺序让你无法做你想做的事。)