Como mudar o autor do commit para um commit específico?

Quero mudar o autor de um commit específico na história. Não é o último compromisso.

Como posso mudar o autor de um commit no git?

Mas estou a pensar numa coisa, onde identifico o commit por hash ou hash curto.

 1445

9 answers

Rebase interactiva de um ponto anterior no histórico do que o commit que precisa de modificar (git rebase -i <earliercommit>). Na lista de commits sendo rebaseado, mude o texto de pick para edit ao lado do hash do que você deseja modificar. Então, quando o git lhe pedir para alterar o commit, use isto:

git commit --amend --author="Author Name <[email protected]>"

Por exemplo, se o seu histórico de commit for A-B-C-D-E-F com F como HEAD, e quiser mudar o autor de C e D, então mudaria...

  1. especificar git rebase -i B ( aqui está um exemplo do que você verá depois de executar o comando git rebase -i B )
    • Se precisar de editar A, use git rebase -i --root
  2. muda as linhas para C e D de pick para edit
  3. Assim que o rebase começasse, faria uma pausa em C
  4. tu farias git commit --amend --author="Author Name <[email protected]>"
  5. Depois git rebase --continue
  6. Faria uma pausa novamente em D
  7. então você iria git commit --amend --author="Author Name <[email protected]>" novamente
  8. git rebase --continue
  9. o rebase seria concluir.
  10. utilize git push -f para actualizar a sua origem com os commits actualizados.
 2445
Author: Amber, 2018-09-16 20:36:38

A resposta aceitea esta pergunta é um uso maravilhosamente inteligente de rebase interactiva, mas infelizmente exibe conflitos se o commit estamos a tentar mudar o autor de usado para estar em um ramo que foi posteriormente fundido. Mais geralmente, não funciona ao lidar com histórias sujas.

Uma vez que estou apreensivo com a execução de programas que dependem da configuração e da desactivação de variáveis de ambiente para reescrever o histórico do git, estou a escrever uma nova resposta baseado em este post que é semelhante a esta resposta mas é mais completa.

O seguinte é testado e funciona, ao contrário da resposta ligada. Suponha por clareza de exposição que 03f482d6 é o commit cujo autor estamos tentando substituir, e 42627abe é o commit com o novo autor.

  1. Verifique o commit que estamos tentando modificar.
    git checkout 03f482d6
    
  2. Faça o autor mudar.

    git commit --amend --author "New Author Name <New Author Email>"
    
    Agora temos um novo compromisso com hash assumiu ser 42627abe.
  3. Confira o ramo original.

  4. Substitua o antigo commit pelo novo localmente.

    git replace 03f482d6 42627abe
    
  5. Reescrever todos os futuros commits com base na substituição.

    git filter-branch -- --all
    
  6. Remova a substituição para limpeza.

    git replace -d 03f482d6
    
  7. Pressione o novo histórico (só utilize -- force se o abaixo falhar, e apenas após verificação da sanidade com git log e/ou git diff).

    git push --force-with-lease
    

Em vez de 4-6 você pode apenas ajustar para o novo commit:

git rebase -i 42627abe
 334
Author: merlin2011, 2018-07-09 16:58:34

A documentação do Github contém um programa que substitui a informação do 'committer' para todos os 'commits' numa ramificação.

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"

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
 139
Author: olivieradam666, 2017-03-23 08:12:26

Você pode alterar o autor da última persistência usando o comando abaixo.

git commit --amend --author="Author Name <[email protected]>"

No entanto, se você quiser mudar mais do que um nome de Autor commits, é um pouco complicado. Você precisa iniciar um rebase interativo, em seguida, marcar commits como editar, em seguida, ammendá-los um por um e terminar.

Começa a ajustar com git rebase -i. Vai mostrar - te algo assim.

Mude a palavra-chave pick para edit para os commits que deseja alterar o autor nome.

Então fecha o editor. Para os principiantes, hit {[4] } em seguida, digite :wq e hit Enter. Então vais ver o teu terminal como se nada tivesse acontecido. Na verdade, você está no meio de um ajuste interativo. Agora é hora de alterar o nome do autor do seu commit usando o comando acima. Ele vai abrir o editor novamente. Sair e continuar a ajustar a base com git rebase --continue. Repita o mesmo para a contagem de commit que deseja editar. Você pode certificar - se que o ajuste interativo terminou quando você receba a mensagem.
 61
Author: Fatih, 2015-08-29 00:52:24
  • Reinicie o seu e-mail para a configuração globalmente:

    git config --global user.email [email protected]

  • Agora repõe o autor da tua persistência sem a edição necessária:

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

 59
Author: pravbeatle, 2018-02-22 07:12:36

As respostas na pergunta a que você ligou são boas respostas e cobrem a sua situação (a outra pergunta é mais geral, uma vez que envolve reescrever vários commits).

Como desculpa para tentar git filter-branch, escrevi um script para reescrever o nome do autor e / ou E-mail do autor para um determinado commit:

#!/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
 47
Author: Chris Johnsen, 2014-05-18 16:34:04

Ao fazer {[3] } há uma parte interessante no doc:

Se quiser dobrar dois ou mais commits em um, substitua o comando "pick" para o segundo commits e subsequentes com "squash" ou "fixup". Se os commits tiverem autores diferentes, o commit dobrado será atribuído ao autor do primeiro commit. A mensagem de commit sugerida para a commit dobrada é a concatenação das mensagens de commit do primeiro commit e daquelas com o comando "squash", mas omite as mensagens de commit com o comando "fixup".

  • Se tem uma história de A-B-C-D-E-F,
  • e você quer alterar os commits B e D (=2 commits),

Depois podes fazer:

  • git config user.name "Correct new name"
  • git config user.email "[email protected]"
  • criar commits vazios (um para cada commit):
    • você precisa de uma mensagem para ajustar o propósito
    • git commit --allow-empty -m "empty"
  • iniciar a operação de ajuste de base
    • git rebase -i B^
    • B^ selecciona o pai de B.
  • você vai querer colocar uma commit vazia antes de cada commit para modificar
  • você vai querer mudar pick para squash para aqueles.

Exemplo do que git rebase -i B^ te dará:

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

Muda isso para:

# 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

Pedir-lhe-á para editar as mensagens:

# 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...
E podes remover as primeiras linhas.
 12
Author: dnozay, 2013-08-28 01:03:14

Existe um passo adicional para a resposta de Amber Se você está usando um repositório centralizado:

git push -f forçar a atualização do repositório central.

Cuidado para que não haja muita gente a trabalhar no mesmo ramo, porque pode arruinar a consistência.
 11
Author: Fabian76, 2017-05-23 12:34:53

Persistir antes de:

enter image description here

Para corrigir o autor de todos os commits, poderá aplicar o comando a partir da resposta de @Amber:

git commit --amend --author="Author Name <[email protected]>"

Ou para reutilizar o seu nome e E-mail você pode apenas escrever:

git commit --amend --author=Eugen

Persistir após o comando:

enter image description here

Por exemplo, para mudar tudo a partir de 4025621:

enter image description here

Tens de correr:

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

Ou adicionar esta Alcunha a ~/.gitconfig:

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

E depois correr:

git reauthor 4025621 Eugen
 2
Author: Eugen Konkov, 2018-06-30 12:16:07