此时提交历史中还有其他人的记录。作为存储库的所有者(来自实际我打算提交的用户),有没有办法“转移”我的提交记录,将“WRONG_USER”中的所有内容删除,并添加到“RIGHT_USER”,而不必删除整个 .git 并从头开始(因为其他贡献者的提交记录必须保留)?
谢谢 :)
由于您已经使用WRONG_EMAIL创建了另一个GitHub帐户(我们在这里称其为WRONG_ACCOUNT),因此无法将WRONG_EMAIL添加为RIGHT_ACCOUNT的辅助电子邮件。
有几种方法可以将提交从WRONG_USER更改为RIGHT_USER:
如果不需要使用WRONG_ACCOUNT,可以删除该帐户。
在WRONG_ACCOUNT设置页面 -> 帐户 -> 删除您的帐户。
然后您可以将WRONG_EMAIL添加为RIGHT_ACCOUNT的辅助电子邮件地址。
您可以使用以下脚本将WRONG_USER更改为RIGHT_USER:
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "WRONG_EMAIL" ];
then
GIT_AUTHOR_NAME="RIGHT_USERNAME";
GIT_AUTHOR_EMAIL="RIGHT_EMAIL";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
然后,您可以通过 git push -f --all
强制推送更改到您的 GitHub 仓库。
嗯,有人问你是否可以重写历史记录(但没有解释后果),你回答说可以(尽管我怀疑你是否理解后果),所以让我们澄清一下。
如果你重写历史记录,那么每个其他用户的存储库都会出现问题。不是“无法修复”,但仍然有问题。他们将不得不采取措施来修复它们;如果你希望他们“正确地”修复它们——也就是说,不撤消你的历史记录重写——那么你需要事先告诉他们发生了什么以及他们需要做什么。
如果这仍然看起来可以,并且值得为了你获得的东西而麻烦,那么可以这样做。我想指出的是,如果我是你项目的贡献者,我不会高兴被强制做出决定,我要付出额外的努力去纠正一个不是我造成的美学问题。
您的用户可能会遇到的情况在git rebase
文档下从上游rebase中恢复中有描述。因此,我建议先查看这个文档。当重写整个存储库历史记录时,我的一般建议是让每个人将他们的所有代码推送到origin并且放弃他们的克隆,然后进行重写,最后让每个人重新克隆;因为在重写之后修复旧的克隆很可能会是一个严重的麻烦。
如果最终您还是决定要重写,您需要使用git filter-branch
和--env-filter
参数。