如何在Git中改变多个提交的作者和提交者的名字和电子邮件?

我在学校的电脑上写了一个简单的脚本,然后把改动提交给Git(在我的pendrive中的repo中,是从我家里的电脑上克隆的)。经过几次提交,我发现我是以根用户的身份提交的。

有没有办法把这些提交的作者改成我的名字?

解决办法

改变作者(或提交者)将需要重写所有的历史。 如果你能接受,并且认为值得,那么你应该看看 git filter-branch。 该手册页包括几个例子,可以让你开始使用。 还要注意的是,您可以使用环境变量来改变作者、提交者、日期等的名字。-- 参见 git man page 的 "环境变量" 部分。

具体来说,你可以用这个命令修复所有错误的作者名字和电子邮件,所有分支和标签(来源:GitHub help)。GitHub help)。)

#!/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
评论(18)

你也可以这样做。

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "" ];
        then
                GIT_COMMITTER_NAME="";
                GIT_AUTHOR_NAME="";
                GIT_COMMITTER_EMAIL="";
                GIT_AUTHOR_EMAIL="";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

注意,如果你是在Windows命令提示符下使用这个命令,那么你需要使用"而不是'

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "" ];
        then
                GIT_COMMITTER_NAME="";
                GIT_AUTHOR_NAME="";
                GIT_COMMITTER_EMAIL="";
                GIT_AUTHOR_EMAIL="";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD
评论(13)

一句话,但如果你有一个多用户的版本库要小心 - 这将改变所有提交的作者和提交者的身份(新)。

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

在字符串中加入断行符(在bash中可以这样做)。

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD
评论(9)