如何修改Git中的几个提交来改变作者

时间:2011-02-12 22:48:02

标签: git git-commit git-rewrite-history

我在Git中做了一系列提交,现在我意识到我忘了正确设置我的用户名和用户邮件属性(新机器)。我还没有将这些提交推送到我的存储库,所以在我这样做之前如何更正这些提交(只有主分支上的3个最新提交)?

我一直在关注git resetgit commit -C <id> --reset-author,但我认为我没有走上正轨。

7 个答案:

答案 0 :(得分:176)

当您拥有filter-branch的强大功能时,Rebase /修改似乎效率低下:

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

(为了清晰起见,分隔线,但没有必要)

确保在完成后检查结果,以确保您没有改变任何你不想要的东西!

答案 1 :(得分:115)

与exec一起使用时,交互式rebase方法非常好用。您可以针对特定提交或rebase中的所有提交运行任何shell命令。

首先设置你的git作者设置

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

然后在给定的SHA

之后重置所有提交的作者
git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"

这将弹出您的编辑器以确认更改。你需要做的就是保存并退出,它将遍历每次提交并运行-x标志中指定的命令。

Per @ Dave的评论如下,您还可以在保持原始时间戳的同时更改作者:

git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"

答案 2 :(得分:58)

仅为最后一次提交更改作者:

git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

假设您只想更改最后N次提交的作者:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

注意

  • --no-edit标记确保git commit --amend不会要求额外确认
  • 当您使用git rebase -i时,您可以手动选择提交作者的提交,

您编辑的文件如下所示:

pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix

答案 3 :(得分:3)

我相信你要找的是git rebase --interactive

它允许您重置为特定提交,然后抛出更改添加或分组提交的历史记录

这里有一个解释https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

答案 4 :(得分:1)

如果您正在寻找脚本,那么这个脚本对我来说很方便。

  1. GitHub下载脚本并将其保存到易于访问的位置。

  2. 更改脚本文件的权限以允许其执行:

    chmod +x changeauthor.sh

  3. 使用错误的提交历史记录导航到存储库

    cd path/to/repo

  4. 运行脚本(带有或不带有标志)

    ../path/to/changeauthor.sh --old-email kaka.ruto@example.com \
        --new-email ruto.kaka@example.com --new-name "Kaka Ruto" --remote origin
    

请小心,因为这会重写当前目录存储库中的所有历史记录!好的是,脚本会向您提供警告和有关您将要做什么的信息

在此处了解更多 https://www.adamdehaven.com/blog/update-commit-history-author-information-for-git-repository/

答案 5 :(得分:0)

如果你对贬低和修改感到不安全,你可以这样做。与此同时,您还要设置您可能要做的全局配置。

git reset HEAD~(撤消上次提交)

git config --global user.name "Your Name"

git config --global user.email you@example.com

git commit -m "message"

答案 6 :(得分:0)

出于这个目的,github记录了

This方法。步骤是:

  1. 打开终端并克隆您的仓库
git clone --bare https://github.com/user/repo.git
cd repo
  1. 编辑以下脚本(替换OLD_EMAILCORRECT_EMAILCORRECT_NAME
#!/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
  1. 将脚本复制/粘贴到您的终端中,然后按Enter键运行它。
  2. 使用git push --force --tags origin 'refs/heads/*'推送更改,您就完成了!