Como mudar o autor commit para um compromisso específico?
-
27-09-2019 - |
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.
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 ...
- Especificamos
git rebase -i B
(Aqui está um exemplo do que você verá depois de executar ogit rebase -i B
comando)- Se você precisar editar
A
, usargit rebase -i --root
- Se você precisar editar
- mude as linhas para ambos
C
eD
a partir depick
paraedit
- Uma vez que o rebase começou, primeiro pausaria em
C
- Você poderia
git commit --amend --author="Author Name <email@address.com>"
- Então
git rebase --continue
- Isso faria uma pausa novamente em
D
- Então você faria
git commit --amend --author="Author Name <email@address.com>"
novamente git rebase --continue
- A rebase completaria.
- 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.
Confira a confirmação que estamos tentando modificar.
git checkout 03f482d6
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
.Confira a filial original.
Substitua o antigo Commit pelo novo localmente.
git replace 03f482d6 42627abe
Reescreva todos os compromissos futuros com base na substituição.
git filter-branch -- --all
Remova a substituição da limpeza.
git replace -d 03f482d6
Empurre a nova história (use apenas -force se o abaixo falhar, e somente após a verificação da sanidade
git log
e/ougit 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.
Mudar o pick
palavra -chave para edit
Para os compromissos que você deseja alterar o nome do autor.
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:
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:
Por exemplo, para mudar tudo a partir de 4025621
:
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
eD
(= 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 deB
.
- você vai querer colocar um commit vazio antes da cada um se compromete a modificar
- você vai querer mudar
pick
parasquash
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
- Primeiro tipo "log git" para obter o ID de confirmação e mais detalhes
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.
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
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>'
É isso, agora apenas pressione ESC,: WQ e você está tudo pronto
Em seguida, Git Push Origin Head: Nome da filial -f [Por favor, cuide -f Force Push Push
Curti
git push -f
ougit push origin HEAD: dev -f