Pergunta

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

Eu sei sobre esta pergunta - Como faço para mudar o autor de um compromisso no Git?

Mas estou pensando em algo, onde identifico o compromisso por hash ou hash curto.

Foi útil?

Solução

Rebase interativa de um ponto anterior na história do que o compromisso que você precisa para modificar (git rebase -i <earliercommit>). Na lista de compromissos sendo rebated, mude o texto de pick para edit ao lado do hash daquele que você deseja modificar. Então, quando o Git solicita que você mude o compromisso, use isso:

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

Por exemplo, se o seu histórico de compromissos é A-B-C-D-E-F com F Como HEAD, e você quer mudar o autor de C e D, então você faria ...

  1. Especificamos git rebase -i B (Aqui está um exemplo do que você verá depois de executar o git rebase -i B comando)
    • Se você precisar editar A, usar git rebase -i --root
  2. mude as linhas para ambos C e D a partir de pick para edit
  3. Uma vez que o rebase começou, primeiro pausaria em C
  4. Você poderia git commit --amend --author="Author Name <email@address.com>"
  5. Então git rebase --continue
  6. Isso faria uma pausa novamente em D
  7. Então você faria git commit --amend --author="Author Name <email@address.com>" novamente
  8. git rebase --continue
  9. A rebase completaria.
  10. Usar git push -f Para atualizar sua origem com as confirmações atualizadas.

Outras dicas

o resposta aceita Para esta questão, é um uso maravilhosamente inteligente de rebase interativa, mas infelizmente exibe conflitos se o compromisso que estamos tentando mudar o autor de costumava estar em um ramo que foi posteriormente mesclado. Mais geralmente, não funciona ao lidar histórias.

esta postagem que é semelhante a esta resposta mas é mais completo.

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

  1. Confira a confirmação que estamos tentando modificar.

    git checkout 03f482d6
    
  2. Fazer o autor mude.

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

    Agora temos um novo commit com hash assumido como ser 42627abe.

  3. Confira a filial original.

  4. Substitua o antigo Commit pelo novo localmente.

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

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

    git replace -d 03f482d6
    
  7. Empurre a nova história (use apenas -force se o abaixo falhar, e somente após a verificação da sanidade git log e/ou git diff).

    git push --force-with-lease
    

Em vez de 4-6, você pode apenas rebaixar no novo comprometimento:

git rebase -i 42627abe

A documentação do GitHub contém Um script que substitui as informações do componente para todos os compromissos em uma filial.

#!/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
  • Redefina seu e -mail para a configuração globalmente:

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

  • Agora redefina o autor de sua confirmação sem editar necessário:

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

Você pode alterar o autor do último comprometimento usando o comando abaixo.

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

No entanto, se você deseja alterar mais de um comete o nome do autor, é um pouco complicado. Você precisa iniciar uma rebase interativa e, em seguida, Mark comete como editar, em seguida, ampliá -los um por um e terminar.

Comece a se rebaixar com git rebase -i. Isso vai te mostrar algo assim.

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

Mudar o pick palavra -chave para edit Para os compromissos que você deseja alterar o nome do autor.

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

Em seguida, feche o editor. Para os iniciantes, acerte Escape então digite :wq e acertar Enter.

Então você verá seu terminal como se nada tivesse acontecido. Na verdade, você está no meio de uma rebase interativa. Agora é hora de alterar o nome do autor de seu compromisso usando o comando acima. Ele abrirá o editor novamente. Desistir e continuar rebase com git rebase --continue. Repita o mesmo para a contagem de compromissos que você deseja editar. Você pode garantir que o Rebase Interactive terminasse quando você obtém o No rebase in progress? mensagem.

As respostas na pergunta à qual você vinculou são boas respostas e cobrem sua situação (a outra pergunta é mais geral, pois envolve a reescrita de várias comissões).

Como uma desculpa para experimentar git filter-branch, Escrevi um script para reescrever o nome do autor e/ou o e -mail do autor para um determinado compromisso:

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

Comprometer antes:

enter image description here

Para consertar o autor para todas as confirmações, você pode aplicar o comando da @Amber's Response:

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

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

git commit --amend --author=Eugen

Comprometa após o comando:

enter image description here

Por exemplo, para mudar tudo a partir de 4025621:

enter image description here

Você deve correr:

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

Nota: Para incluir um autor que contenha espaços como um nome e endereço de e -mail, o autor deve estar cercado por cotações escapadas. Por exemplo:

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

ou adicione este alias em ~/.gitconfig:

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

E então corra:

git reauthor 4025621 Eugen

Há um passo adicional para Resposta de Amber Se você estiver usando um repositório centralizado:

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

Cuidado com o fato de não haver muitas pessoas trabalhando no mesmo ramo, porque isso pode arruinar a consistência.

Ao fazer git rebase -i Há uma parte interessante no documento:

Se você quiser dobrar dois ou mais começos em um, substitua o comando "pick" para o segundo e subsequente compromissos com "squash" ou "fixup". Se os compromissos tivessem autores diferentes, o compromisso dobrado será atribuído ao autor da primeira confirmação. A mensagem de comprometimento sugerida para o compromisso dobrado é a concatenação das mensagens de confirmação do primeiro compromisso e daqueles com o "squash" comando, mas omite as mensagens de confirmação de compromisso com o "fixup" comando.

  • Se você tem um histórico de A-B-C-D-E-F,
  • E você quer mudar de compromisso B e D (= 2 compromissos),

Então você pode fazer:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • Crie compromissos vazios (um para cada confirmação):
    • você precisa de uma mensagem para fins de rebase
    • git commit --allow-empty -m "empty"
  • Inicie a operação de rebase
    • git rebase -i B^
    • B^ seleciona o pai de B.
  • você vai querer colocar um commit vazio antes da cada um se compromete a modificar
  • você vai querer mudar pick para squash para aqueles.

Exemplo de quê git rebase -i B^ Darei à você:

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

mude 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

Isso solicitará que você edite 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 você pode simplesmente remover as primeiras linhas.

Em maior parte de Eugen Konkov resposta, para começar a partir do commit raiz, use --root bandeira. o --no-edit A bandeira também é útil

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

Se o que você precisa mudar é o autor da última confirmação e nenhum outro está usando seu repositório, você pode desfazer seu último commit com:

git push -f origin last_commit_hash:branch_name 

Mude o nome do autor do seu commit com:

git commit --amend --author "type new author here"

Saia do editor que abre e empurre novamente seu código:

git push

Há também uma abordagem preguiçosa para esse problema, especialmente se você tiver mais de um compromisso que deseja mudar. No meu caso, tive um novo ramo com várias confirmações com um autor errado, então o que me ajudou:

Vá para o seu ramo original:

git checkout develop

Crie uma nova filial a partir dela:

git checkout -b myFeature develop 

Mesclar sem comprometer informações como um comprometimento:

git merge --no-commit --squash branchWrongAuthor

Você também pode querer realizar mudanças:

git stage .

Mude o nome do autor e cometer mudanças:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

E é isso, você pode pressionar as mudanças.

git push

Você pode excluir o ramo com um autor errado depois disso.

Se a confirmação que você deseja alterar não for a última confirmação, siga as etapas abaixo. Se o seu compromisso estiver em uma filial diferente, primeiro mude para essa filial.

git checkout ramil_name

Encontre o comprometimento antes do compromisso que você deseja mudar e encontrar seu hash. Em seguida, emita o comando rebase.

git rebase -i -p hash de compromisso

Em seguida, um editor abrirá e digitará 'Editar' para os compromissos que você deseja alterar. Deixe outras pessoas com a opção de 'escolha' padrão. Uma vez alterado, enter a tecla 'ESC' e WQ! sair.

Em seguida, emita o comando GIT Commit com a opção de alteração.

Git Commit --Emend --author = "Email de nome de usuário"--não-edit

Em seguida, emita o seguinte comando.

Git Rebase -Continue

Uma vez que o autor Commit é atualizado no repositório local, empurre as alterações no repositório remoto.

Passos para renomear o nome do autor após o commit empurrado

  1. Primeiro tipo "log git" para obter o ID de confirmação e mais detalhes
  2. Git Rebase I Head ~ 10 (10 é o compromisso total a exibir no Rebase)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. Em seguida, digite "Git Rebase -Continue" ou "Git Rebase --abort", conforme sua necessidade

    • Agora sua janela de Will Rebase foi aberta, clique na tecla "I" do teclado
    • Então você receberá uma lista de começos para 10 [porque passamos 10 compromissos acima] como abaixo

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Agora você precisa adicionar o comando abaixo logo abaixo do compromisso que deseja editar, como abaixo

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'

    1. É isso, agora apenas pressione ESC,: WQ e você está tudo pronto

    2. Em seguida, Git Push Origin Head: Nome da filial -f [Por favor, cuide -f Force Push Push

    Curti git push -f ou git push origin HEAD: dev -f

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top