¿Cómo cambio el nombre/correo electrónico del autor y del autor de confirmaciones múltiples?
¿Cómo cambio el autor de una serie de confirmaciones?
NOTA: Esta respuesta cambia los SHA1, así que tenga cuidado al usarla en una rama que ya ha sido enviada. Si solo deseas corregir la ortografía de un nombre o actualizar un correo electrónico antiguo, Git te permite hacerlo sin tener que volver a escribir el historial usando .mailmap
. Vea mi otra respuesta .
Usando Rebase
Primero, si aún no lo has hecho, probablemente querrás arreglar tu nombre en git-config:
git config --global user.name "New Author Name"
git config --global user.email "<[email protected]>"
Esto es opcional, pero también asegurará restablecer el nombre del confirmador, asumiendo que eso es lo que necesita.
Para reescribir metadatos para una variedad de confirmaciones usando una rebase, haga
git rebase -r <some commit before all of your bad commits> \
--exec 'git commit --amend --no-edit --reset-author'
--exec
ejecutará el git commit
paso después de reescribir cada confirmación (como si lo ejecutara git commit && git rebase --continue
repetidamente).
Si también desea cambiar su primera confirmación (también llamada confirmación 'raíz'), deberá agregarla --root
a la llamada de rebase.
Esto cambiará tanto el confirmador como el autor a su configuración user.name
/ user.email
. Si no desea cambiar esa configuración, puede usar --author "New Author Name <[email protected]>"
en lugar de --reset-author
. Tenga en cuenta que al hacerlo no se actualizará el autor de la confirmación, solo el autor.
Compromiso único
Si solo desea cambiar la confirmación más reciente, no es necesario cambiar la base. Simplemente modifique el compromiso:
git commit --amend --no-edit --reset-author
Historia completa del proyecto
git rebase -r --root --exec "git commit --amend --no-edit --reset-author"
Para clientes de Git más antiguos (anteriores a julio de 2020)
-r,--rebase-merges
Puede que no exista para ti. Como reemplazo, puedes usar -p
. Tenga en cuenta que -p
tiene problemas graves y ahora está en desuso.
Esta respuesta usa
git-filter-branch
, para lo cual los documentos ahora dan esta advertencia:git filter-branch tiene una gran cantidad de trampas que pueden producir alteraciones no obvias de la reescritura del historial prevista (y puede dejarle poco tiempo para investigar dichos problemas, ya que tiene un rendimiento abismal). Estos problemas de seguridad y rendimiento no se pueden solucionar de manera compatible con versiones anteriores y, como tal, no se recomienda su uso. Utilice una herramienta de filtrado de historial alternativa como git filter-repo . Si aún necesita usar git filter-branch, lea atentamente SEGURIDAD (y RENDIMIENTO ) para conocer las minas terrestres de filter-branch y luego evite atentamente tantos de los peligros enumerados allí como sea razonablemente posible.
Cambiar el autor (o autor de la confirmación) requeriría reescribir toda la historia. Si estás de acuerdo con eso y crees que vale la pena, entonces deberías consultar git filter-branch . La página del manual incluye varios ejemplos para ayudarle a comenzar. También tenga en cuenta que puede utilizar variables de entorno para cambiar el nombre del autor, la persona que confirma la confirmación, las fechas, etc. Consulte la sección "Variables de entorno" de la página del manual de git .
Específicamente, puedes corregir todos los nombres de autor y correos electrónicos incorrectos para todas las ramas y etiquetas con este comando (fuente: ayuda de GitHub ):
#!/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
Para utilizar la herramienta de filtrado de historial alternativa git filter-repo , primero puede instalarla y construir una git-mailmap
según el formato de gitmailmap .
Proper Name <[email protected]> Commit Name <[email protected]>
Y luego ejecute filter-repo con el mapa de correo creado:
git filter-repo --mailmap git-mailmap