如何正确更改 github 中过去几次提交的提交作者?

How do I properly change the author of a commit for the past few commits in github?

在过去的几天里,我使用了另一台笔记本电脑,我设置了 git 并登录了,但我不小心使用了错误的电子邮件地址。

今天我注意到我过去几天的提交没有显示在我的 github 个人资料仪表板上,所以检查了发生了什么并注意到我使用了错误的电子邮件登录。

我尝试了几种不同的方法来修复它,但其中 none 有效。

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”。我试过了,但它也进行了新的提交,并且没有将旧的提交与旧日期保持一致。


所以,我需要帮助来获取我历史上的所有新提交并修复旧的提交以获得良好的电子邮件。

首先尝试将存储库克隆到 单独的 本地文件夹中,以测试以下命令。

您需要安装 newren/git-filter-repo 才能将作者从旧帐户重写到新帐户。

参见“How to change commit author for multiple commits using filter branch?”和
git filter-repo / User and email based filtering

git filter-repo --mailmap my-mailmap

my-mailmap:

Correct Name <correct@email.com> <old@email.com>

这将与正确的作者重写您的提交。

然后您将需要 git push --force(假设有一个 main 分支)以便用您的新提交覆盖远程历史记录。如果您不是一个人在远程存储库上工作,请确保让您的合作者知道。

您非常接近正确的方法。只是在变基时不要添加 -p

根据 git 文档, https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---preserve-merges

-p option - Recreate merge commits instead of flattening the history by replaying commits a merge commit introduces.

我做了与你在问题中提到的相同的步骤,但没有 -p,并且它完美地工作。以下是步骤列表,以备不时之需。


首先,在本地克隆 repo,并对所有提交进行交互式 rebase。

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

对于您想要更改其作者的所有提交,将命令从 pick

更改为 edit

就像下面的例子一样,我想更改 35 的作者,所以

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 以查看提交时间戳是否是您想要的。

感谢大家的帮助!我最终得到了很多不同的方法,但对我来说没有用,我最终不得不多次将我的 repo 变基到更改之前的状态,因为事情变得一团糟。
最后我联系了 Github 支持,这是他们告诉我要做的,并且成功了。我把它张贴在这里,希望它能帮助有类似问题的人。

P.S。这与建议 here 的答案非常相似,但是当我尝试时该答案不起作用。这个有一些小的变化(克隆一个裸副本并在那里执行更改)并且它确实有效。


1 - 在 运行 运行此脚本之前,您需要:

显示在您要更改的 author/committer 字段中的旧电子邮件地址 您希望将此类提交归因于的正确名称和电子邮件地址 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="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 -- --branches --tags

4 - 按 Enter 进入 运行 脚本。

5 - 查看新的 Git 错误历史记录。

6 - 将更正的历史推送到:

  git push --mirror <GitHub repo URL>.git

7 - 清理临时克隆:

  cd ..
  rm -rf <reponame>.git