在Git历史记录中更改电子邮件地址

时间:2012-11-25 14:53:09

标签: git git-filter-branch

我已经在git仓库工作了一段时间并做了一些提交。我一直在我的php文件中使用文档块,包括我的私人电子邮件地址,如下所示:

/**
 * Bla bla bla.
 * 
 * @author:      Nic <foo@bar.com>
 */

现在我已经创建了一个新的电子邮件地址并更新了文档块,用新的地址替换了旧地址。但是这个更改仅适用于我更改文档之后的提交。

如何从git的历史记录中完全删除旧的电子邮件地址,并用新地址替换所有实例?

我尝试使用this blog post使用git filter-branch但没有成功。我得到以下结果:

git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#old-email@example.com#new-email@foobar.com#g"' -- --all
Usage: git core\git-filter-branch [--env-filter <command>] [--tree-filter <command>]
        [--index-filter <command>] [--parent-filter <command>]
        [--msg-filter <command>] [--commit-filter <command>]
        [--tag-name-filter <command>] [--subdirectory-filter <directory>]
        [--original <namespace>] [-d <directory>] [-f | --force]
        [<rev-list options>...]

可能是电子邮件地址(@和。)的特殊字符搞乱了正则表达式吗?除此之外,我不知道出了什么问题,感谢任何帮助!

3 个答案:

答案 0 :(得分:5)

另一种选择是以这种方式尝试过滤分支:

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Nick NLD" ];
  then export GIT_AUTHOR_EMAIL=your_new_email@example.com;
  fi; git commit-tree "$@"'

答案 1 :(得分:4)

我不知道为什么会收到使用信息。复制&amp;粘贴你的命令得到过滤器分支为我运行。但是,它实际上并没有修改任何文件。这确实是因为电子邮件地址中的@字符导致perl将@email视为列表变量,并将其替换为(不存在的)内容。所以正则表达式正在寻找old-email.com

可以使用\@代替perl命令中的@符号来解决这个问题。旧电子邮件地址中的.是正则表达式的特殊字符,但它将与其他任何内容匹配。在这种情况下,模式的其余部分可能足够严格,这无关紧要,因此您可能不需要逃避它。

答案 2 :(得分:2)

看到Git开始显示

WARNING: git-filter-branch has a glut of gotchas […] use an
     alternative filtering tool such as 'git filter-repo'
     (https://github.com/newren/git-filter-repo/) instead.

equivalent command

git-filter-repo --email-callback 'return email.replace(b"old@dusty.tld", b"new@shiny.tld")'