我已经在Github上提交了一堆提交到一个项目,但我意识到我没有在我目前用于提交的计算机上设置正确的电子邮件和提交者全名,因此用户的头像和电子邮件地址不存在。
我如何重写所有过去提交的电子邮件和用户名?
我已经在Github上提交了一堆提交到一个项目,但我意识到我没有在我目前用于提交的计算机上设置正确的电子邮件和提交者全名,因此用户的头像和电子邮件地址不存在。
我如何重写所有过去提交的电子邮件和用户名?
当前回答
在这里看到的:
git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD
其他回答
https://help.github.jp/enterprise/2.11/user/articles/changing-author-info/
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="oldEmail@xxx-MacBook-Pro.local"
CORRECT_NAME="yourName"
CORRECT_EMAIL="yourEmail"
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 -- --branches --tags
这对我来说很管用。git推送后,确保在git的门户网站上看到更新。如果提交仍然没有链接到我的帐户,在提交旁边显示默认的缩略图,并且它没有反映在我的贡献时间表上,转到提交url并在url的末尾附加.patch,并验证名称和电子邮件是正确的。
在这里看到的:
git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD
如果您已经将一些提交推到公共存储库,则不希望这样做,否则它将生成其他人可能使用的主历史记录的替代版本。“不要过河……那就糟了……”
也就是说,如果只是提交到本地存储库,那么务必在推送到服务器之前修复这个问题。你可以使用git filter-branch命令和——commit-filter选项,这样它只编辑与你的错误信息匹配的提交,就像这样:
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
then
GIT_AUTHOR_NAME="Your Name Here (In Lights)";
GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
已经给出的答案是完整的。但你确定,你需要这些吗?如。我也遇到过类似的问题,但在这种情况下,答案是多余的。我的案例和解决方案如下:
假设您有两个电子邮件id, no_longer_want@gmail.com和want@gmail.com。以前的提交可能是通过no_longer_want@gmail.com进行的,这不是您想要的电子邮件id。在这种情况下,一个选择是简单地将want@gmail.com链接到你的GitHub帐户。
怎么做呢?
在设置页面的电子邮件部分找到添加电子邮件的选项。
还失去了吗?
github页面上提到的前三个步骤就足够了。
注意:
Github支持单个Github帐户的多个电子邮件id。 由于您没有替换电子邮件id,而只是添加了一个新的电子邮件id,通过两个电子邮件id提交的文件都链接到您的Github帐户。 没有必要将want@gmail.com设置为主要电子邮件id。
考虑到不需要使用git-filter-branch,在git-filter-repo中做同样的事情(你可能需要先用pip install git-filter-repo安装它):
git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' --email-callback 'return email.replace(b"old@email.com", b"new@email.com")'
如果存储库是原始的,w/o远程,您将不得不添加——force来强制重写。(在执行此操作之前,您可能需要创建回购的备份。)
如果你不想保留引用(它们会显示在Git GUI的分支历史中),你必须添加——replace-refs delete-no-add。
要了解更高级的功能,请参见“姓名和电子邮件过滤”。
附注:从https://stackoverflow.com/a/59591928/714907窃取并改进。