¿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?


2
¿Es un representante solo para usted, para algunas personas o para un gran proyecto?
thejh



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 GIT_AUTHOR_EMAIL=hobo@example.com;
  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
        GIT_AUTHOR_EMAIL=john@example.com
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        GIT_COMMITTER_EMAIL=john@example.com
    fi
' -- --all

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 GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'

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 GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'

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" "johnsmith@example.com"

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)


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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.