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

12

我已经在一个Git仓库上工作了一段时间并进行了一些提交。我一直在我的PHP文件中使用文档块,包括我的私人电子邮件地址,就像这样:

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

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

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

我尝试使用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个回答

11
另一种选择是尝试使用filter-branch这种方式进行操作:
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 "$@"'

4
这只会改变提交的作者,问题是要找到一种方法来更改文件内容中的电子邮件地址。 - qqx
我已经找到了,但是像qqx所说的那样,它会更改提交的邮件地址,而不是文件内部的文档块。 - Nic Wortel
就像@KjellAndreassen所说的那样,从$GIT_AUTHOR_NAME中删除多余的“=”,这将完美解决问题! - earth2jason

8

看到 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")'

4
我不知道为什么你会得到一个使用信息。复制并粘贴您的命令可以使筛选分支运行。但是,它没有实际修改任何文件。这确实是因为电子邮件地址中的`@`字符,导致perl将`@email`视为列表变量,并用(不存在的)内容替换它。因此,正则表达式正在寻找`old-email.com`。
这可以通过在perl命令中使用`\@`代替`@`符号来修复。旧电子邮件地址中的`.`是正则表达式的特殊字符,但它将与自身以及其他任何内容匹配。在本例中,模式的其余部分可能足够严格,所以您可能不需要转义。

谢谢。也许我应该配置一些东西才能使filter-branch工作?我有点git小白,以前从未使用过filter-branch。 - Nic Wortel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接