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>...]

会不会是电子邮件地址的特殊字符(@ 和 .)弄乱了正则表达式?除此之外,我不知道出了什么问题,任何帮助表示赞赏!

4

3 回答 3

9

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

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 "$@"'
于 2012-11-25T15:02:47.420 回答
7

看到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.

等效的命令是:

git-filter-repo --email-callback \
    'return email.replace(b"old@dusty.tld", b"new@shiny.tld")'
于 2020-09-06T18:48:58.063 回答
4

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

这可以通过使用\@代替@perl 命令中的符号来解决。旧.电子邮件地址中的 是正则表达式的特殊字符,但它会与其他任何内容一起匹配自身。在这种情况下,模式的其余部分可能足够严格以至于这无关紧要,所以你可能真的不需要逃避它。

于 2012-11-25T15:36:43.500 回答