Como mudar o autor do commit para um commit específico?
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...
- especificar
git rebase -i B
( aqui está um exemplo do que você verá depois de executar o comandogit rebase -i B
)- Se precisar de editar
A
, usegit rebase -i --root
- Se precisar de editar
- muda as linhas para
C
eD
depick
paraedit
Assim que o rebase começasse, faria uma pausa em - tu farias
git commit --amend --author="Author Name <[email protected]>"
- Depois
git rebase --continue
Faria uma pausa novamente em - então você iria
git commit --amend --author="Author Name <[email protected]>"
novamente git rebase --continue
- o rebase seria concluir.
- utilize
git push -f
para actualizar a sua origem com os commits actualizados.
C
D
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.
-
Verifique o commit que estamos tentando modificar.
git checkout 03f482d6
-
Faça o autor mudar.
Agora temos um novo compromisso com hash assumiu sergit commit --amend --author "New Author Name <New Author Email>"
42627abe
. Confira o ramo original.
-
Substitua o antigo commit pelo novo localmente.
git replace 03f482d6 42627abe
-
Reescrever todos os futuros commits com base na substituição.
git filter-branch -- --all
-
Remova a substituição para limpeza.
git replace -d 03f482d6
-
Pressione o novo histórico (só utilize -- force se o abaixo falhar, e apenas após verificação da sanidade com
git log
e/ougit diff
).git push --force-with-lease
Em vez de 4-6 você pode apenas ajustar para o novo commit:
git rebase -i 42627abe
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
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.
: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.
-
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
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
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
eD
(=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 deB
.
- você vai querer colocar uma commit vazia antes de cada commit para modificar
- você vai querer mudar
pick
parasquash
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.
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.
Persistir antes de:
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:
Por exemplo, para mudar tudo a partir de 4025621
:
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