更改作者和提交者姓名和e

我在学校计算机上写了一个简单的脚本,并对Git进行了更改(在我的电脑上的回购中,从家中的计算机中克隆)。 在几次提交之后,我意识到我是以root用户的身份提交的。

有什么方法可以将这些提交的作者更改为我的名字吗?


改变作者(或提交者)需要重写所有的历史。 如果你没有问题,并认为它是值得的,那么你应该检查出git filter-branch。 手册页包含几个例子,以帮助您入门。 另外请注意,您可以使用环境变量来更改作者,提交者,日期等的名称 - 请参阅git手册页的“环境变量”部分。

具体来说,您可以使用此命令修复所有分支和标记的错误作者姓名和电子邮件(来源:GitHub帮助):

#!/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

使用交互式Rebase

你可以做

git rebase -i -p <some HEAD before all of your bad commits>

然后在rebase文件中将所有不良提交标记为“编辑”。 如果您还想更改第一次提交,则必须将其手动添加为rebase文件中的第一行(按照其他行的格式)。 然后,当git要求您修改每个提交时,请执行

 git commit --amend --author "New Author Name <email@address.com>" 

编辑或关闭打开的编辑器,然后执行

git rebase --continue

继续进行重组。

你可以跳过在这里完全打开编辑器,方法是追加--no-edit这样命令就是:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && 
git rebase --continue

单一提交

正如一些评论者指出的,如果你只是想改变最近的提交,那么rebase命令就没有必要了。 做就是了

 git commit --amend --author "New Author Name <email@address.com>"

这会将作者更改为指定的名称,但提交者将在git config user.namegit config user.email设置为您的配置用户。 如果你想将提交者设置为你指定的东西,这将设置作者和提交者:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

关于合并提交的注意事项

我最初的回应有一个小小的缺陷。 如果<some HEAD before all your bad commits>当前HEAD<some HEAD before all your bad commits>之间存在任何合并提交,那么git rebase会将它们压扁(顺便说一句,如果使用GitHub pull请求,将会出现大量合并在你的历史中提交)。 这往往会导致非常不同的历史记录(因为重复的更改可能会“重新发布”),并且在最糟糕的情况下,它可能会导致git rebase要求您解决困难的合并冲突(这可能已在合并提交中解决)。 解决的办法是使用-p标志来git rebase ,这将保留你的历史的合并结构。 git rebase的联机帮助页警告使用-p-i会导致问题,但是在BUGS部分中,它说“编辑提交并重新提交它们的提交消息应该可以正常工作。”

我已经添加了-p到上述命令。 对于只更改最近提交的情况,这不是问题。


你也可以这样做:

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

请注意,如果您在Windows命令提示符下使用此命令,则需要使用"而不是'

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD
链接地址: http://www.djcxy.com/p/741.html

上一篇: Change the author and committer name and e

下一篇: Do I cast the result of malloc?