Git,重写以前的提交用户名和电子邮件


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


如果您已经将一些提交推送到了公共存储库,则不希望这样做,否则它将生成其他人可能使用的主历史的备用版本。"不要过河…会很糟糕的……"

也就是说,如果只是您对本地存储库所做的提交,那么在向上推到服务器之前,一定要解决这个问题。您可以将git filter-branch命令与--commit-filter选项一起使用,因此它只编辑与您的错误信息匹配的提交,如下所示:

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"),特别是如果使用了其他输入方法