如何更改一个特定提交的提交作者?

MicTech 1949 git git-commit

我想更改历史记录中某个特定提交的作者.这不是最后一次提交.

我知道这个问题 - 如何在git中更改提交的作者?

但我正在考虑一些事情,我通过哈希或短哈希来识别提交.

Amber.. 3268

在历史记录之前的某个点上的交互式rebase不是您需要修改的提交(git rebase -i <earliercommit>).在要重新提交的提交列表中,将文本从更改为pick要修改的文本edit的哈希旁边.然后,当git提示您更改提交时,请使用以下命令:

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

例如,如果你的提交历史是A-B-C-D-E-FF作为HEAD的,你想改变的作者CD,然后你会......

  1. 指定git rebase -i B(这是执行git rebase -i B命令后将看到的示例)
    • 如果你需要编辑A,请使用git rebase -i --root
  2. 更改两者CD从的pickedit
  3. 一旦rebase开始,它将首先暂停 C
  4. 你会 git commit --amend --author="Author Name <email@address.com>"
  5. 然后 git rebase --continue
  6. 它会再次暂停 D
  7. 然后你会git commit --amend --author="Author Name <email@address.com>"再次
  8. git rebase --continue
  9. rebase将完成.
  10. 用于使用git push -f更新的提交更新您的来源.

  • 使用`--no-edit`选项.`git commit --amend --reset-author --no-edit`不会打开编辑器.自git 1.7.9起可用. (188认同)
  • 很好的答案,但对于初学者:首先在你想改变的那个之前找到一个提交,然后运行`git rebase -i <commit>` (81认同)
  • @Brenden修改项目中的第一个提交,使用`git rebase -i --root` (46认同)
  • 如果你不知道你在哪个编辑器,答案很可能是"vim".要保存并退出,请键入Esc:wq Enter.另一方面,如果是Nano,你会在底部看到"WriteOut:^ O"之类的东西,那么你应该使用Ctrl + O,Enter,Ctrl + X代替. (38认同)
  • 如果你想修改第一次提交怎么办?之前的提交哈希是什么? (26认同)
  • 请注意,您可以使用`git commit --amend --reset-author`将提交作者设置为当前用户 (9认同)
  • @Mathew Byrne或指定a1b3c3d4 ^来引用前面的提交. (5认同)
  • 使用命令`git push -f remote branch-name`完成rebase后,你必须强制推送到git,以便将更改应用到远程. (5认同)
  • 按照所有这些步骤后,我必须运行```git push -f``` (5认同)
  • 这里有一点需要注意:重新定位会缩小合并历史记录,这会导致历史记录显着改变,甚至在重新定位时也会出现困难的合并冲突.要使git不这样做,请将`-p`选项添加到`git rebase`. (4认同)
  • 我将这条线从拾取更改为编辑,但如何继续...我在文本编辑器中,但我不知道在更改线后如何继续... (2认同)
  • 添加`--reuse-message = HEAD`标志以避免编辑每个提交消息 (2认同)
  • 我到底需要做一次推力? (2认同)
  • @ user593644如果你已经在rebase之前推了,是的. (2认同)
  • 你太棒了!节省了我的时间.谢谢.那些不知道编辑界面的人,按下"插入"打开屏幕上的编辑模式,而git bash提出你的提交列表.然后,按照步骤2中的建议进行更改.完成后,按"Esc"进入完全编辑模式,然后按":wq"+"Enter"保存并继续下一步. (2认同)
  • 添加`-C @`,例如`git commit --amend --author ="作者姓名<email@address.com> -C @`将为您节省一些步骤.这将自动重用提交消息,编辑器不会一切都开放. (2认同)

merlin2011.. 453

这个问题的接受答案是巧妙地巧妙地使用交互式rebase,但不幸的是,如果我们试图改变以前的作者的提交是在一个随后被合并的分支上,那么它就会表现出冲突.更一般地说,它不起作用在处理凌乱的历史时.

因为我担心运行依赖于设置和取消设置环境变量的脚本来重写git历史记录,所以我根据这篇文章写了一个新的答案,这个答案这个答案类似,但是更完整.

与链接的答案不同,以下内容经过测试和运行.为了清楚说明,03f482d6我们正在尝试替换作者的提交,并且42627abe是新作者的提交.

  1. 签出我们试图修改的提交.

    git checkout 03f482d6
    
  2. 让作者改变.

    git commit --amend --author "New Author Name <New Author Email>"
    

    现在我们有一个假定为hash的新提交42627abe.

  3. 签出原始分支.

  4. 在本地替换旧的提交.

    git replace 03f482d6 42627abe
    
  5. 根据替换重写所有未来的提交.

    git filter-branch -- --all
    
  6. 取下更换清洁度.

    git replace -d 03f482d6
    
  7. 推送新历史记录(如果以下操作失败,则仅使用--force,并且仅在使用git log和/或进行完整性检查后git diff).

    git push --force-with-lease
    

而不是4-6,你可以改变到新的提交:

git rebase -i 42627abe

  • 这看起来很明显替代了可怕的`git rebase -i`.从来没有听说过这个'git replace`的事情.+1 (37认同)
  • 请在第2步之后在那里放一张纸条重新检查您的原始分支. (9认同)
  • 警告:请注意`git filter-branch - --all`正在更改原始提交所在的所有分支中的提交.如果您没有足够的凭据(或者您只是不想更改其他分支历史记录) ),小心这个答案是好的. (5认同)
  • 我建议使用`--force-with-lease`而不是`-f`.它更安全. (4认同)
  • 要清理refs/original/... backup,请参见[here](http://stackoverflow.com/a/7654880/1342186) (3认同)
  • @ merlin2011,谢谢你的精彩帖子.我实际上已经尝试了它并且它工作得很好,但是有一个很小的改变:在`步骤5`中的`git replace -d`之后,似乎需要一个`git checkout master`命令.否则我仍然在一个未命名的分支上,`git push`在那里不起作用.你对此有何看法? (2认同)

olivieradam6.. 203

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

  • 这会在所有提交中更改它,而不仅仅是一个.有趣的是,我在不到30分钟前做到了这一点. (11认同)
  • git push -f完成魔术。感谢这颗珍珠! (3认同)
  • 注意,如果你避免使用`clone` /`push`,你最终会得到一个备份命名空间`refs/original /`.我找不到一种方法来智能地删除这个命名空间,所以我最终删除了目录`.git/refs/original`,这有效. (2认同)

pravbeatle.. 138

  • 将您的电子邮件重置为全局配置:

    git config --global user.email example@email.com

  • 现在重置提交的作者而不需要编辑:

    git commit --amend --reset-author --no-edit

  • 太好了,可惜这只是最后一次提交。幸运的是,我在最近的两次上都需要它,所以只做了一个git reset HEAD〜,运行了建议的行,然后再次手动进行了下一次提交。工作正常! (2认同)
  • 谢谢!--reset-author为我完成了窍门,因为没有它,作者会更改,但“提交者”将保留旧的作者详细信息。 (2认同)

Fatih Acet.. 78

您可以使用以下命令更改上次提交的作者.

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

但是,如果要更改多个提交作者名称,则有点棘手.您需要启动交互式rebase,然后将提交标记为编辑,然后逐个修改它们并完成.

git rebase -i.开始变基.它会告诉你这样的事情.

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

pick关键字更改edit为要更改作者姓名的提交.

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

然后关闭编辑器.对于初学者,点击Escape然后键入:wq并点击Enter.

然后你会看到你的终端没有发生任何事情.实际上你正处于交互式变基的中间.现在是时候使用上面的命令修改提交的作者姓名了.它将再次打开编辑器.退出并继续使用git rebase --continue.对要编辑的提交计数重复相同的操作.您可以确保在收到No rebase in progress?消息时完成了交互式rebase .


Chris Johnse.. 55

您链接的问题中的答案是很好的答案并涵盖您的情况(另一个问题是更一般的,因为它涉及重写多个提交).

作为尝试的借口git filter-branch,我写了一个脚本来重写给定提交的作者姓名和/或作者电子邮件:

#!/bin/sh

#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
#     If -f is supplied it is passed to "git filter-branch".
#
#     If <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "$@"
    exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"

TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL

filt='

    if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
        if test -n "$TARG_EMAIL"; then
            GIT_AUTHOR_EMAIL="$TARG_EMAIL"
            export GIT_AUTHOR_EMAIL
        else
            unset GIT_AUTHOR_EMAIL
        fi
        if test -n "$TARG_NAME"; then
            GIT_AUTHOR_NAME="$TARG_NAME"
            export GIT_AUTHOR_NAME
        else
            unset GIT_AUTHOR_NAME
        fi
    fi

'

git filter-branch $force --env-filter "$filt" -- $br

  • Github文档包含[类似脚本](https://help.github.com/articles/changing-author-info) (11认同)
  • @ olivieradam666就像一个魅力,它更容易阅读 (2认同)

Eugen Konkov.. 35

提交之前:

在此输入图像描述

要修复所有提交的作者,您可以从@ Amber的答案中应用命令:

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

或者重复使用您的姓名和电子邮件,您可以写:

git commit --amend --author=Eugen

命令后提交:

在此输入图像描述

例如,从4025621以下各项开始更改全部:

在此输入图像描述

你必须运行:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

注意:要包含包含名称和电子邮件地址等空格的作者,作者必须被转义引号括起来.例如:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621

或者将此别名添加到~/.gitconfig:

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

然后运行:

git reauthor 4025621 Eugen

  • 这是最符合我的目的的答案,谢谢。而且由于我只是想调整*我*的电子邮件地址,因此在更新.git / config后,可以使用--exec =“ git commit --amend --reset-author”运行。 (3认同)

小智.. 15

如果您使用的是集中式存储库,那么Amber的答案还有一个步骤:

git push -f 强制更新中央存储库.

要小心,没有很多人在同一个分支上工作,因为它会破坏一致性.


dnozay.. 14

在做什么git rebase -i时,文档中有这个有趣的内容:

如果你想将两个或更多的提交折叠成一个,替换命令"pick"与第二次及以后提交"squash""fixup".如果提交具有不同的作者,则折叠的提交将归因于第一次提交的作者.折叠提交的建议提交消息是第一次提交的提交消息和具有该"squash"命令的提交消息的串联,但是省略了使用该"fixup"命令提交的提交消息.

  • 如果你有历史A-B-C-D-E-F,
  • 并且您想要更改提交BD(= 2次提交),

然后你可以这样做:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • 创建空提交(每次提交一次):
    • 你需要一个用于rebase目的的消息
    • git commit --allow-empty -m "empty"
  • 启动rebase操作
    • git rebase -i B^
    • B^选择父母B.
  • 您需要每次提交之前进行一次空提交以进行修改
  • 你将要改变picksquash这些.

什么git rebase -i B^会给你的例子:

pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty

改为:

# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

它会提示您编辑消息:

# This is a combination of 2 commits.
# The first commit's message is:

empty

# This is the 2nd commit message:

...some useful commit message there...

你可以删除前几行.


korwalskiy.. 11

为了促进Eugen Konkov的响应,从根提交开始,使用--rootflag。该--no-edit标志也很有帮助

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"


归档时间:

查看次数:

861945 次

最近记录:

9 月,2 周 前