协慌网

登录 贡献 社区

如何更改一个特定提交的提交作者?

我想更改历史记录中某个特定提交的作者。这不是最后一次提交。

我知道这个问题 - 如何在 git 中更改提交的作者?

但我正在考虑一些事情,我通过哈希或短哈希来识别提交。

答案

交互式 rebase 偏离历史记录中的某个点而不是您需要修改的提交( git rebase -i <earliercommit> )。在要重新提交的提交列表中,将文本从pick更改为要edit的哈希旁边的edit 。然后,当 git 提示您更改提交时,请使用以下命令:

git commit --amend --author="Author Name <[email protected]>"

例如,如果您的提交历史记录是ABCDEF其中FHEAD ,并且您想要更改CD的作者,那么您将......

  1. 指定git rebase -i B这是执行git rebase -i B命令后将看到的示例
    • 如果你需要编辑A ,请使用git rebase -i --root
  2. pickedit更改CD的行
  3. 一旦 rebase 开始,它将首先在C暂停
  4. 你会git commit --amend --author="Author Name <[email protected]>"
  5. 然后git rebase --continue
  6. 它会在D再次暂停
  7. 然后你再次git commit --amend --author="Author Name <[email protected]>"
  8. git rebase --continue
  9. rebase 将完成。
  10. 使用git push -f使用更新的提交更新您的源。

这个问题的接受答案是巧妙地巧妙地使用了交互式 rebase,但不幸的是,如果我们试图改变曾经的作者在一个随后被合并的分支上的提交,它会表现出冲突。更一般地说,它不起作用在处理凌乱的历史时。

因为我担心运行依赖于设置和取消设置环境变量的脚本来重写 git 历史记录,所以我根据这篇文章写了一个新的答案, 这个答案类似于这个答案但更完整。

与链接的答案不同,以下内容经过测试和运行。为了清楚地说明03f482d6是我们试图替换的作者的提交, 42627abe是新作者的提交。

  1. 签出我们试图修改的提交。

    git checkout 03f482d6
  2. 让作者改变。

    git commit --amend --author "New Author Name <New Author Email>"

    现在我们有一个新的提交,哈希假定为42627abe

  3. 签出原始分支。

  4. 在本地替换旧的提交。

    git replace 03f482d6 42627abe
  5. 根据替换重写所有未来的提交。

    git filter-branch -- --all
  6. 取下更换清洁度。

    git replace -d 03f482d6
  7. 推送新的历史记录(如果以下操作失败,则仅使用 --force,并且仅在使用git log和 / 或git diff进行完整性检查后)。

    git push --force-with-lease

而不是 4-6 你可以改变到新的提交:

git rebase -i 42627abe

Github 文档包含一个脚本,用于替换分支中所有提交的提交者信息

#!/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