当我开始使用git时,我只是做了一个git init并开始调用addcommit。现在,我开始关注,可以看到我的提交显示为cowens@localmachine,而不是我想要的地址。似乎设置GIT_AUTHOR_EMAILGIT_COMMITTER_EMAIL可以完成我想要的操作,但是我仍然使用错误的电子邮件地址/名称来保留那些旧提交。我该如何纠正旧的提交?

评论

对于我们的未来读者:在Stack Overflow上最好问有关将git用于类似目的的问题。

这是stackoverflow.com上最接近的问题。

#1 楼

您可以返回并通过一次调用git filter-branch来修复所有提交。这与重新设置具有相同的作用,但是您只需要执行一个命令即可修复所有历史记录,而无需单独修复每个提交。

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

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 docs
获得

评论


好吧,git filter-branch --env-filter'export GIT_AUTHOR_EMAIL =“ foo@example.com”; GIT_AUTHOR_NAME =“ Foo”'非常简单,谢谢。如果我可以更改它,这将是可接受的答案(似乎Server Fault出现错误)。

– Chas。欧文斯
09年5月27日在18:07

请注意,输出行的等号两边不应有空格。即它们应如下所示:export GIT_AUTHOR_EMAIL =“(正确的电子邮件)”;

–安迪·巴拉姆(Andy Balaam)
09年11月3日,12:12

现在,我将如何在Windows上执行此操作?

–戴卡德
2012年3月9日21:56

@Deckard:将脚本保存到文本文件(例如fixcommits.sh),然后运行Git Bash并运行脚本。我将脚本文件放在存储库的根目录中,然后导航到Git Bash中的该文件夹,然后使用./fixcommits.sh运行脚本。

–雪崩
2012年4月30日0:20在

附录1此命令格式对我不起作用,但是如果/曾经那么有效:if [“ $ GIT_AUTHOR_EMAIL” =“ $ oldemail”];然后GIT_AUTHOR_EMAIL =“ $ newemail”;科幻

–乔什·M。
15年4月14日在17:02

#2 楼

Git的filter-branch命令功能强大,但对于任何不重要的事情,例如,如果您有多个作者需要更正的话,使用它都是非常笨拙的。

我发现这是一个有用的替代方法,它使用git-shortlog联机帮助页中介绍的.mailmap功能。这提供了我们可以与git log的格式化工具一起使用的作者映射机制。我们可以使用它来生成命令,以选择并修改命名的提交序列。

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

您需要在存储库的顶层目录中创建一个.mailmap文件,该文件将现有作者姓名映射为正确的作者姓名。您可以使用以下命令获取现有作者姓名的列表:

git shortlog -se


您需要以这样的.mailmap文件结尾(例如):

You <you@somewhere.org>   cowens@localmachine
You <you@somewhere.org>   root@localmachine


现在,您可以使用git log的格式设置功能来生成命令,将$ 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创建一个新的空分支。对于$ START到$ BRANCH结束之间的每次提交,第二个命令Cherry选择原始提交到当前分支$ 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>\\" && \" 
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
` "echo success" '


因此,当您需要更正作者时,现在您只是需要生成一个.mapfile并执行以下操作:

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


可以将原始分支引用重新分配给新的分支引用,并删除新的分支引用:

q4312078q

评论


这太棒了。如果我有更多代表,我会赏金的。谢谢 :)

–开心果
2012-12-10 8:32



#3 楼

结合我如何在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 foo@example.com"
# (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 foo@example.com"
# (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


评论


使我处于正确的轨道上,但需要来自以下命令:stackoverflow.com/a/28536828/307而不是--author用法

–布雷特·文斯特拉(Brett Veenstra)
2015年10月3日,下午3:19

#4 楼

要遵循jedberg的回答:您可以使用rebase -i并选择编辑有问题的提交。如果先使用git commit --amend --author <AUTHOR DETAILS>,然后再使用git rebase continue,则可以检查并修复历史记录。