Pregunta ¿Cómo cambiar el nombre del autor y del committer y el correo electrónico de múltiples commits en Git?


Estaba escribiendo un guión simple en la computadora de la escuela y cometiendo los cambios a Git (en un repositorio que estaba en mi pendrive, clonado desde mi computadora en casa). Después de varios commits, me di cuenta de que estaba cometiendo cosas como usuario root.

¿Hay alguna forma de cambiar el autor de estos commits a mi nombre?


1998
2018-04-15 03:09


origen


Respuestas:


Cambiar el autor (o committer) requeriría volver a escribir todo el historial. Si estás de acuerdo con eso y crees que vale la pena, entonces deberías echarle un vistazo git filter-branch. La página man incluye varios ejemplos para comenzar. También tenga en cuenta que puede usar variables de entorno para cambiar el nombre del autor, committer, fechas, etc. - vea la sección "Variables del entorno" de la página de git man.

Específicamente, puede corregir todos los nombres y correos electrónicos incorrectos de los autores para todas las ramas y etiquetas con este comando (fuente: Ayuda de GitHub)

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

800
2018-04-15 03:16



Usando Rebase interactivo

Podrías hacerlo

git rebase -i -p <some HEAD before all of your bad commits>

Luego marque todas las confirmaciones incorrectas como "editar" en el archivo rebase. Si también desea cambiar su primer compromiso, debe agregarlo manualmente como primera línea en el archivo rebase (siga el formato de las otras líneas). Entonces, cuando git le pida que modifique cada compromiso, haga

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

edite o simplemente cierre el editor que se abre, y luego haga

git rebase --continue

para continuar la rebase.

Puede omitir la apertura del editor en conjunto aquí añadiendo --no-edit para que el comando sea:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

Single Commit

Como algunos de los comentaristas han notado, si solo quieres cambiar la confirmación más reciente, el comando rebase no es necesario. Solo haz

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

Esto cambiará el autor al nombre especificado, pero el committer se configurará para su usuario configurado en git config user.name y git config user.email. Si desea establecer el committer a algo que especifique, esto establecerá tanto el autor como el committer:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

Nota sobre los compromisos de fusión

Hubo un pequeño error en mi respuesta original. Si hay algún compromiso de fusión entre el actual HEAD y tu <some HEAD before all your bad commits>, entonces git rebase los aplanará (y por cierto, si usas solicitudes de extracción de GitHub, habrá un montón de compromisos de fusión en tu historial). A menudo, esto puede llevar a una historia muy diferente (ya que los cambios duplicados pueden ser "redefinidos"), y en el peor de los casos, puede conducir a git rebase pidiéndole que resuelva conflictos de fusión difíciles (que probablemente ya se resolvieron en las asignaciones de fusión). La solución es usar el -p bandera para git rebase, lo que preservará la estructura de fusión de tu historial. La página de manual para git rebase advierte que usando -p y -i puede conducir a problemas, pero en el BUGS La sección dice "La edición de confirmaciones y la nueva redacción de los mensajes de confirmación deberían funcionar bien".

he añadido -p al comando anterior. Para el caso en el que solo está cambiando la confirmación más reciente, esto no es un problema.


1415
2017-08-24 03:08



También puedes hacer:

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

Tenga en cuenta que si usa este comando en el símbolo del sistema de Windows, debe usar "en lugar de ':

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD

565
2018-05-15 19:15



Un trazador de líneas, pero tenga cuidado si tiene un repositorio de múltiples usuarios: esto cambiará todas se compromete a tener el mismo (nuevo) autor y committer.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

Con linebreaks en la cadena (que es posible en bash):

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD

481
2018-04-15 03:22



Sucede cuando no tiene inicializado un $ HOME / .gitconfig. Puedes arreglar esto como:

git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author

probado con la versión de Git 1.7.5.4


201
2018-02-16 09:46



Para una única confirmación:

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

(extraído de la respuesta del asmeurer)


179
2018-04-26 22:50



En el caso donde solo los primeros commits tienen malos autores, puedes hacer esto dentro git rebase -i utilizando el exec comando y el --amend cometer, de la siguiente manera:

git rebase -i HEAD~6 # as required

que te presenta la lista editable de confirmaciones:

pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2

Luego añade exec ... --author="..." líneas después de todas las líneas con malos autores:

pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD

guardar y salir del editor (para ejecutar).

Esta solución puede ser más larga de escribir que otras, pero es muy controlable: sé exactamente qué se compromete.

Gracias a @asmeurer por la inspiración.


150
2017-12-08 17:05



Github tiene un buena solución, que es el siguiente script de shell:

#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'

107
2017-10-07 09:54