¿Puedo cambiar mi nombre y apellido en todas las confirmaciones anteriores?

122

Me gustaría cambiar mi nombre, apellido y correo electrónico en todas mis confirmaciones, ¿es posible?

Joshua
fuente
2
¿Es un representante solo para usted, para algunas personas o para un gran proyecto?
thejh
3
posible duplicado de ¿Cómo cambio el autor de un commit en git?
Josh Lee

Respuestas:

212

Uso git-filter-branch.

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
  then export GIT_AUTHOR_NAME="Hobo Bob"; export [email protected];
  fi; git commit-tree "$@"'

Esto solo afecta al autor, no al committer (que para la mayoría de los commits será el mismo que el autor). Si desea reescribirlos también, configure las variables GIT_COMMITTER_NAMEy GIT_COMMITTER_EMAIL.

Se aplica la advertencia estándar sobre la reescritura del historial; solo hazlo a la historia que aún no se ha compartido.

Actualización de junio de 2018

El manual ahora incluye una solución, utilizando --env-filter, en sus ejemplos: https://git-scm.com/docs/git-filter-branch#_examples :

git filter-branch --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
    then
        [email protected]
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        [email protected]
    fi
' -- --all
Josh Lee
fuente
44
Si está utilizando msysgit, todavía tiene acceso a bash. De lo contrario, no tengo idea.
Josh Lee
@Joshua si estás usando algo donde no tienes bash, probablemente podrías usar el script por lotes de Windows, aunque no lo he probado.
MatrixFrog
¿Y las etiquetas? esta solución no cambiará el autor de las etiquetas
piotrek
@Joshua revisa el repositorio de git en una caja de Linux y realiza la reparación allí
Will Sheppard
¿Hay alguna opción que resulte en una nueva rama y deje los compromisos de origen intactos?
Eugen Konkov
56

Para reescribir tanto el autor como el responsable en todas las confirmaciones seleccionadas:

git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export [email protected];\
export GIT_COMMITTER_NAME="Commmiter Name";\
export [email protected];\
fi;\
git commit-tree "$@"'
usuario11153
fuente
1
Pero, ¿cómo aplicar los cambios al servidor remoto?
vikyd
55
@Viky Trygit push --all origin --force
user11153
2
Esto funciona para mi ! Estoy usando GitLab, tengo que desproteger la rama antes del comando push.
vikyd
37

Si no hay otros autores, puede hacer:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export [email protected]; git commit-tree "$@"'
denis.peplin
fuente
1
No está reescribiendo la información de "Committer:".
user11153
1
No está destinado a reescribir la información del committer. Si desea hacer eso, exporte también GIT_COMMITTER_NAME y GIT_COMMITTER_EMAIL (consulte la respuesta aceptada).
Cronospoon el
12

Guarde el script a continuación como, por ejemplo, ~/.bin/git-replace-authory ejecútelo usando, por ejemplo:

git replace-author "John Ssmith" "John Smith" "[email protected]"

Sin argumentos, actualiza todas las confirmaciones con su nombre para usar su dirección de correo electrónico actual de acuerdo con la configuración de Git.

DEFAULT_NAME="$(git config user.name)"
DEFAULT_EMAIL="$(git config user.email)"
export OLD_NAME="${1:-$DEFAULT_NAME}"
export NEW_NAME="${2:-$DEFAULT_NAME}"
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}"

echo "Old:" $OLD_NAME "<*>"
echo "New:" "$NEW_NAME <$NEW_EMAIL>"
echo "To undo, use: git reset $(git rev-parse HEAD)"

git filter-branch --env-filter \
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then
    export GIT_AUTHOR_NAME="${NEW_NAME}"
    export GIT_AUTHOR_EMAIL="${NEW_EMAIL}"
    export GIT_COMMITTER_NAME="${NEW_NAME}"
    export GIT_COMMITTER_EMAIL="${NEW_EMAIL}"
fi'

Raw (para descargar)

Zaz
fuente
Como una breve nota: ~/.bin/tiene que estar dentro de los usuarios $PATHy las necesidades de archivo para ser ejecutable, por lo ejecute: chmod +x ~/.bin/git-replace-author.
Michael Gecht
¿Y qué hace con los argumentos?
Eugen Konkov
2

Solo si no has llevado tus compromisos al mundo. De lo contrario, todos los demás tienen su antiguo nombre en su repositorio, lo que es poco probable que pueda cambiar el de todos.

EnabrenTane
fuente
Es cierto, pero en algunos casos no tienes otra opción. En mi caso, tenía una dirección de correo electrónico incorrecta configurada en mi configuración de git (como pude ver con "git config --global -l"). Como resultado, no tuve actividad de confirmación en mi propio repositorio de Github (¡porque la dirección de correo electrónico no coincidía con el correo electrónico configurado en Github)! Para resolver esto, arreglé mis commits locales usando la receta de stackoverflow.com/a/23564785/2474068 (funcionó perfectamente) y luego envié los commits cambiados a Github usando "git push -u -f origin master" (con la fuerza bandera "-f"). ¡Eso va en contra de la práctica aceptada pero no tuve elección!
leo
1
Sí, mi punto era que las horquillas de ese repositorio no tendrían ese cambio a menos que aceptaran tu empuje de fuerza. Sería desafiante actualizar cada bifurcación :)
EnabrenTane