Git, rewrite previous commit usernames and emails
我已经在Github上提交了一系列的项目,但是我意识到我没有在我当前用于提交的计算机上设置正确的电子邮件和提交者全名,因此用户的虚拟人物和电子邮件地址不在那里。
如何重写所有过去提交的电子邮件和用户名?
您可以添加此别名:
1 | git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter "if [[ \\"\$\`echo \$VAR\`\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi" \$@; }; f" |
更改作者姓名:
1 | git change-commits GIT_AUTHOR_NAME"old name""new name" |
或仅最后10个提交的电子邮件:
1 | git change-commits GIT_AUTHOR_EMAIL"[email protected]""[email protected]" HEAD~10..HEAD |
别名:
1 | change-commits ="!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter "if [[ \\"$`echo $VAR`\\" = '$OLD' ]]; then export $VAR='$NEW'; fi" \$@; }; f" |
来源:https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
解决方案已经存在:在git中更改多个提交的作者和提交者名称和电子邮件
即,
1 2 3 | git filter-branch -f --env-filter \ "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \ GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD |
如果您已经将一些提交推送到了公共存储库,则不希望这样做,否则它将生成其他人可能使用的主历史的备用版本。"不要过河…会很糟糕的……"
也就是说,如果只是您对本地存储库所做的提交,那么在向上推到服务器之前,一定要解决这个问题。您可以将
1 2 3 4 5 6 7 8 9 | git filter-branch --commit-filter ' if ["$GIT_AUTHOR_EMAIL" ="wrong_email@wrong_host.local" ]; then GIT_AUTHOR_NAME="Your Name Here (In Lights)"; GIT_AUTHOR_EMAIL="correct_email@correct_host.com"; git commit-tree"$@"; else git commit-tree"$@"; fi' HEAD |
应用奥利维尔·威尔第的答案后:
1 2 3 | git filter-branch -f --env-filter \ "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \ GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD |
…要在原始存储库中推送更改的历史记录,请使用:
1 | git push origin +yourbranch |
上面的命令(注意加号)也强制重写原始回购的历史记录。小心使用!
对于那些只需要简单复制粘贴版本(除了更新电子邮件和姓名外)的用户:
1 2 3 4 5 | git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter "if [[ \\"\$\`echo \$VAR\`\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi" \$@; }; f" git change-commits GIT_AUTHOR_NAME"<Old Name>""<New Name>" -f git change-commits GIT_AUTHOR_EMAIL <[email protected]> -f git change-commits GIT_COMMITTER_NAME"<Old Name>""<New Name>" -f git change-commits GIT_COMMITTER_EMAIL <[email protected]> -f |
https://help.github.com/articles/changing-author-info网站/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="[email protected]" CORRECT_NAME="yourName" CORRECT_EMAIL="yourEmail" 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 |
这对我完全有效。在Git推送之后,确保在Git的Web门户上看到更新。如果提交仍未链接到我的帐户,则在提交旁边显示默认的缩略图图像,并且该图像未反映在我的提交时间表图表上,请转到提交URL并在URL末尾追加.patch,然后验证名称和电子邮件是否正确。
自69F0423CB3D8DE35CB1E022093ED9044DCC7AB03周一至2001年9月17日00:00:00来自:XXX
注意上面脚本中的引号("not"),特别是如果使用了其他输入方法