如何编辑git的历史logging来更正不正确的电子邮件地址/名称

当我开始使用git时,我只是做了一个git init并开始调用addcommit 。 现在我开始注意了,我可以看到,我的提交显示为cowens@localmachine ,而不是我想要的地址。 看起来好像设置GIT_AUTHOR_EMAILGIT_COMMITTER_EMAIL会做我想要的,但我仍然有这些旧的提交与错误的电子邮件地址/名称。 我怎样才能纠正旧的提交?

    你可以回去修改所有的提交,只需要一次调用git filter-branch。 这与rebase具有相同的效果,但是您只需要执行一个命令来修复所有历史logging,而不是分别修复每个提交。

    您可以使用以下命令修复所有错误的电子邮件:

     git filter-branch --env-filter ' oldname="(old name)" oldemail="(old email)" newname="(new name)" newemail="(new email)" [ "$GIT_AUTHOR_EMAIL"="$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail" [ "$GIT_COMMITTER_EMAIL"="$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail" [ "$GIT_AUTHOR_NAME"="$oldname" ] && GIT_AUTHOR_NAME="$newname" [ "$GIT_COMMITTER_NAME"="$oldname" ] && GIT_COMMITTER_NAME="$newname" ' HEAD 

    更多的信息可以从git文档中获得

    Git的filter-branch命令是强大的,但是对于任何非平凡的东西来说,使用它是非常难以处理的,例如,如果你有多个作者需要纠正。

    这里有一个我觉得有用的select,它使用了git-shortlog联机帮助页中描述的.mailmap特性。 这提供了一个作者映射机制,我们可以使用git日志的格式化工具。 我们可以用它来生成命令来挑选和修改一个命名的提交序列。

    例如,假设您想要更改$ BRANCH分支上的作者身份,从提交$ START开始。

    您需要在存储库的顶部目录中创build一个.mailmap文件,该文件将现有的作者名称映射到正确的作者名称。 您可以通过以下方式获取现有作者姓名的列表:

     git shortlog -se 

    你需要结束一个.mailmap文件这样(说):

     You <[email protected]> cowens@localmachine You <[email protected]> root@localmachine 

    现在你可以使用git log的格式化function来生成命令,将$ BRANCH重写为$ BRANCH2。

     git checkout -b $BRANCH2 $START git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh - 

    第一个命令从提交$ START创build一个新的空分支。 对于$ START和$ BRANCH结束之间的每个提交,第二个命令cherry将原始提交select到当前分支$ BRANCH2的末尾,并将其修改为正确设置作者。

    这也是普遍适用的 – 放在你的〜/ .gitconfig:

     [alias] # git reauthor $START..$END reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H && git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" ' 

    所以,当你需要纠正作者,现在你只需要生成一个.map文件,并做:

     git checkout -b $BRANCH2 $START git reauthor $START..$BRANCH 

    原分支引用可以被重新分配到新的分支,新的分支被删除:

     git checkout $BRANCH git reset --hard $BRANCH2 # be careful with this command git branch -d $BRANCH2 

    结合从我如何解决第一次提交在git的元信息的答案?

     ### Fix the first commit ### # create a temporary tag for the root-most commit so we can reference it git tag root `git rev-list HEAD | tail -1` # check it out on its own temporary branch git checkout -b new-root root # amend the commit git commit --amend --author "Foo [email protected]" # (or if you've set the proper git **config** values) git commit --amend -C HEAD --reset-author # now you've changed the commit message, so checkout the original branch again git checkout @{-1} # and rebase it onto your new root commit git rebase --onto new-root root ### Fix the rest of the commits ### git rebase -i root # edit the file to read "edit <commit number> for each entry # amend the commit git commit --amend --author "Foo [email protected]" # (or if you've set the proper git **config** values) git commit --amend -C HEAD --reset-author # move to the next commit git rebase --continue # continue running the last two commands until you see # Successfully rebased and updated refs/heads/master. ### Clean up ### # nuke the temporary branch we created git branch -d new-root # nuke the temporary tag we created git tag -d root 

    按照jedberg的回答:您可以使用rebase -i并select编辑相关的提交。 如果你使用git commit --amend --author <AUTHOR DETAILS>然后git rebase continue你可以通过修复历史logging。