首页 > 解决方案 > 如何从 `git log --all --format="%aN <%ae>` 输出中删除我的私人电子邮件?

问题描述

我正在阅读这篇文章:https ://help.github.com/articles/changeing-author-info/ 。

请注意文章顶部的警告:“警告:此操作会破坏您的存储库的历史记录。如果您正在与其他人协作处理存储库,则重写已发布的历史记录被认为是不好的做法。您应该只在紧急情况下这样做。” '很遗憾,似乎没有办法重写历史,只重写电子邮件和/或作者姓名。感谢 GitHub 为不请自来的电子邮件提供了一个矢量,但无法更改这一点!似乎下一个最佳选择是更改电子邮件,通知重要联系人,并且不启用从旧电子邮件转发到新电子邮件。如果您选择使用此选项,那么您可能还希望仅对您联系人中的人启用自动回复(Gmail 中提供的一项功能,不确定其他电子邮件提供商),例如:

由于收到了太多的电子邮件,包括许多不请自来的电子邮件,我已经更改了我的电子邮件地址,并且不再积极监控这封邮件。如果您想就我很可能感兴趣的事情与我联系,请通过<插入一些通讯媒介与我联系,例如您网站页面上带有社交媒体链接的联系表或您的https:// about.me页面>

我将在这里重现这些步骤:

跑:

# It is simplest if you use a repo that you have
# already contributed to.
git clone --bare https://github.com/user/repo.git 
cd repo.git

使用以下脚本将文件(称为git-author-rewrite.shgar.sh)添加到目录中,替换,并使用适当的值:repo.gitOLD_EMAILCORRECT_NAMECORRECT_EMAIL

#!/bin/sh

# gar is short for git-author-rewrite

git filter-branch -f --env-filter '

    OLD_EMAIL="your-old-email@example.com"
    CORRECT_NAME="Your Correct Name"
    CORRECT_EMAIL="your-correct-email@example.com"
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME"
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_AUTHOR_NAME="$CORRECT_NAME"
        export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
    ' --tag-name-filter cat -- --exclude="refs/original" --all 
    # originally this had `-- --branches --tags`, but has been revised as
    # per the answer below, and a -f also added.

为脚本添加 exec 权限:chmod +x gar.sh. 运行脚本:./gar.sh.

在运行脚本并使用它检查所有分支的历史记录后,git log --all --format="%aN <%ae>" | sort -u它仍然显示我的私人电子邮件地址。我收到垃圾邮件(在某些情况下,人们甚至提到“我注意到你为 X repo 做出了贡献”),并且一直小心避免公开列出我的电子邮件(提交历史除外,直到我更改为不使用我的GitHub 上的私人电子邮件)。所以我需要在所有分支中运行这个脚本。--all但是,如果删除该选项,我的私人电子邮件已从输出中删除。

脚本的输出包括一些“警告:参考未refs/heads/some_branch更改”行,尽管有许多“参考 'refs/heads/some-branch-name' 已重写”。

如何从git log --all --format="%aN <%ae>" | sort -u输出中删除我的私人电子邮件?编辑:git log --exclude="refs/original" --all --format="%aN <%ae>" | sort -u按照第一个答案中的建议使用。

我不确定为什么,但是您需要运行脚本两次,因为在运行脚本后运行上述日志命令后,它仍然会输出我的私人电子邮件。我猜第二次运行会覆盖备份,并且 log 命令没有正确排除所有备份。

待办事项:尝试git log --exclude="refs/original/*" --all --format="%aN <%ae>" | sort -u

编辑:在将更改推送到原始远程(甚至是上游)之后,它正在更改文件,我不知道为什么,也不知道如何修复它。

我还就此向 GitHub 发送了反馈,并将根据他们的回复进行更新。但是,也许这里有人可以帮助我。

标签: git

解决方案


-- --all在末尾尝试相同的 git filter-branch 命令:它会处理分支和标签,但也会处理远程引用。

然后检查你的结果git log --all

另请注意,使用过滤器分支,如果原始 refs 与重写的不同,将存储在命名空间中refs/original/:确保您git log --all没有列出那些 refs ( refs/original):它们仍会引用您的旧电子邮件。


推荐阅读