代码之家  ›  专栏  ›  技术社区  ›  Dan Lenski

使用git filter分支同时重写作者/提交者和提交消息

  •  5
  • Dan Lenski  · 技术社区  · 14 年前

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

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

    问题是…我需要把作者的信息从承诺中删除 信息 . 据我所知, Git过滤器分支 允许您筛选和更改作者信息(使用 --env-filter )和/或筛选提交消息(使用 --msg-filter ) 同时执行这两项操作,在不同的过滤器之间共享信息。

    所以我对如何做到这一点感到困惑…我能想到的最好的方法是在多次传递中完成:首先,收集所有提交消息,然后编写一个脚本来遍历并过滤所有作者/提交者信息。这看起来很不美观,而且很容易出错,所以我想知道是否有其他人能更顺利地完成这类工作。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Cascabel    14 年前

    我能想到的唯一一件事就是使用提交过滤器。与消息过滤器一样,它在stdin上获取日志消息,因此您将能够对其进行解析,并了解您需要什么。然后您可以自己设置适当的变量并调用 git commit-tree 你自己。(提交过滤器实质上是替换提交树的一种方法,采用相同的参数并生成相同的输出。)

    在bash中,应该是这样的:

    message=$(read_from_stdin)
    
    modify_env_vars "$message"
    
    echo "$message" | git commit-tree "$@"
    

    我从来没有尝试过,但是我不明白为什么它不能工作,假设您正确地编写这两个shell函数!

    (只是一张小纸条-不是那么多 --env-filter --msg-filter 不能互相影响,就是他们总是按这样的顺序运行。因此,第一个过滤器可能会在文件或环境中留下副作用,供其他人查看,但它们的顺序会阻止您执行所需的操作。)