¿Cómo cambio el nombre/correo electrónico del autor y del autor de confirmaciones múltiples?

Resuelto Flávio Amieiro asked hace 15 años • 42 respuestas

¿Cómo cambio el autor de una serie de confirmaciones?

Flávio Amieiro avatar Apr 15 '09 10:04 Flávio Amieiro
Aceptado

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'

--execejecutará el git commitpaso después de reescribir cada confirmación (como si lo ejecutara git commit && git rebase --continuerepetidamente).

Si también desea cambiar su primera confirmación (también llamada confirmación 'raíz'), deberá agregarla --roota 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-mergesPuede que no exista para ti. Como reemplazo, puedes usar -p. Tenga en cuenta que -ptiene problemas graves y ahora está en desuso.

asmeurer avatar Aug 24 '2009 03:08 asmeurer

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-mailmapsegú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
Pat Notz avatar Apr 15 '2009 03:04 Pat Notz