在过去的几天里,我使用了另一台笔记本电脑,我设置了 git 并登录,但我不小心使用了错误的电子邮件地址的用户名。
今天我注意到我过去几天的提交没有显示在我的 github 个人资料仪表板上,所以检查了发生了什么,并注意到我使用了错误的电子邮件登录。
我尝试了几种不同的方法来修复它,但没有一个起作用。
1.
git rebase -i -p <The last commit with the good email>
然后对于每次提交。
git commit --amend --author="good name <good email>" --no-edit
git rebase --continue
它不是仅仅更改提交的作者,而是使用我的好电子邮件进行了新的提交,但没有更改旧的提交。
2.
git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
GIT_AUTHOR_EMAIL=correct@email;
GIT_AUTHOR_NAME="Correct Name";
GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all
如here所见,但它没有做任何事情...
3. 在其中一个答案中,有人提到我应该使用与我使用的相同的命令。
git rebase -i -p <The last commit with the good email>
但没有“-p”。我尝试过,但它也进行了新的提交,并且没有将旧的提交与旧的日期一起保留。
因此,我需要帮助获取我历史记录中的所有新提交并修复旧提交以获得良好的电子邮件。
感谢所有提供帮助的人!我最终得到了很多不同的方法,但对我来说并没有成功,我最终不得不多次将我的存储库重新设置为更改之前的状态,因为事情变得一团糟。
最后我联系了 Github 支持人员,他们告诉我这样做,结果成功了。我将其发布在这里,希望它可以帮助有类似问题的人。
附注这与here建议的答案非常相似,但当我尝试时该答案不起作用。这个有一些小的变化(克隆一个裸副本并在那里执行更改)并且它确实有效。
1 - 在运行此脚本之前,您需要:
您要更改的作者/提交者字段中显示的旧电子邮件地址 您希望此类提交归因于的正确姓名和电子邮件地址 2 - 创建一个新的、裸露的存储库克隆:
git clone --bare <external repo URL>.git
cd <reponame>.git
3 - 复制并粘贴脚本,根据您收集的信息替换以下变量:
OLD_EMAIL
CORRECT_NAME
CORRECT_EMAIL
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
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
4 - 按 Enter 运行脚本。
5 - 查看新的 Git 历史记录是否有错误。
6 - 将更正的历史记录推送到:
git push --mirror <GitHub repo URL>.git
7 - 清理临时克隆:
cd ..
rm -rf <reponame>.git
首先尝试将存储库克隆到单独的本地文件夹中,以便测试以下命令。
您需要安装 newren/git-filter-repo 才能将作者从旧帐户重写到新帐户。
请参阅“如何使用过滤器分支更改多个提交的提交作者?”和
“
git filter-repo
/ 基于用户和电子邮件的过滤”
git filter-repo --mailmap my-mailmap
与
my-mailmap
:
Correct Name <[email protected]> <[email protected]>
这将用正确的作者重写你的提交。
然后,您将需要
git push --force
(假设有一个 main
分支),以便用新提交覆盖远程历史记录。如果您不是独自一人在远程存储库上工作,请务必让您的协作者知道。
您已经非常接近正确的方法了。只是在变基时不要添加
-p
。
根据 git 文档, https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---preserve-merges
选项 - 重新创建合并提交,而不是通过重播合并提交引入的提交来展平历史记录。-p
我执行了与您在问题中提到的相同的步骤,没有
-p
,并且效果完美。以下是步骤列表,以备您需要时使用。
首先,在本地克隆存储库,并对所有提交进行交互式变基。
git rebase --interactive COMMIT~
例如:-
git rebase --interactive 8020fc5fe36d75b066f7c06a29c92a29ccf6e2b4~
其中
8020fc5fe36d75b066f7c06a29c92a29ccf6e2b4
是您要开始修复的最旧的提交。
您可以从
git log
获取此值
运行
git rebase
后,您将拥有一个文本编辑器,其中每次提交都有 pick
/edit
/... 选项。
举个例子,你会得到这样的东西......
pick 8020fc5 1
pick e99c3c7 2
pick 7c4f81e 3
pick 3b30037 4
pick 98d901b 5
pick 8ded5a1 6
pick 5a61adc 7
pick 8fe082c 8
pick 1abebc1 9
对于您想要更改作者的所有提交,请将命令从
edit
更改为
pick
就像下面的例子一样,我想更换
3
和 5
的作者,所以
pick 8020fc5 1
pick e99c3c7 2
edit 7c4f81e 3 #changed here
pick 3b30037 4
edit 98d901b 5 #changed here
pick 8ded5a1 6
pick 5a61adc 7
pick 8fe082c 8
pick 1abebc1 9
现在保存文件并退出。
然后,您将处于应用您设置为
edit
的第一个提交之前的时间点。
无需更改任何内容,执行以下步骤..
git commit --amend --author="NAME <EMAIL>" --no-edit
git rebase --continue
在此之后,存储库将位于应用您选择的第二次提交之前的位置
edit
,因此请重复此操作直到完成
更新:
git rebase --committer-date-is-author-date HASH
,其中 HASH 是具有正确时间戳的第一个提交。
然后执行
git log --format=fuller
查看提交时间戳是否是您想要的。
您可以将
git-filter-repo
与 .mailmap
文件一起使用来更改作者信息,例如过去几次提交的用户名、电子邮件,甚至是分支中的所有提交
您可以查看我的存储库了解详细信息,只需几个步骤: