2010-12-20 4 views
98

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

+2

¿Es un reprository por sólo que, para algunas personas o para un gran proyecto? – thejh

+3

posible duplicado de [¿Cómo cambio el autor de una confirmación en git?] (Http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in -git) –

+0

posible duplicado de [¿Cómo reescribo nombres de committer en un repositorio de git?] (http://stackoverflow.com/questions/1566809/how-do-i-rewrite-committer-names-in-a-git -repositorio) –

Respuesta

166

Use 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 "[email protected]"' 

Esto solo afecta al autor, no al autor (que para la mayoría de las confirmaciones será el mismo que el del autor). Si quiere reescribirlos también, configure las variables GIT_COMMITTER_NAME y GIT_COMMITTER_EMAIL.

Se aplica el standard warning sobre el historial de reescritura; solo hágalo en la historia que aún no se haya compartido.

+0

¿Pero qué hacer en Windows? – Joshua

+3

Si está utilizando 'msysgit', todavía tiene acceso a' bash'. De lo contrario, no tengo idea. –

+1

@Joshua actualizado porque olvidé la información del committer. –

2

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

+0

Es cierto, pero en algunos casos no tiene otra opción. En mi caso, configuré una dirección de correo electrónico incorrecta en mi configuración de git (como pude ver con "git config --global -l"). Como resultado, no tuve actividad de compromiso apareciendo 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 confirmaciones locales usando la receta de http://stackoverflow.com/a/23564785/2474068 (funcionó perfecto) y luego presioné los commits modificados a Github usando "git push -u -f origin master" (con la bandera de la fuerza "-f"). ¡Eso va en contra de la práctica aceptada, pero no tuve otra opción! – leo

+1

Sí, mi punto era que cualquier bifurcación de ese repositorio no tendría ese cambio a menos que aceptaran su impulso de fuerza. Sería un desafío conseguir que todos los tenedores se actualicen :) – EnabrenTane

31

Si no hay otros autores, puede hacerlo:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \ 
export [email protected]; git commit-tree "[email protected]"' 
+1

No está reescribiendo la información de "Committer:". – user11153

+1

No tiene la intención de reescribir la información del committer. Si quieres hacerlo, exporta GIT_COMMITTER_NAME y GIT_COMMITTER_EMAIL también (ver respuesta aceptada). – chronospoon

45

Para volver a escribir tanto el autor como commiter en todos los envíos seleccionados:

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 "[email protected]"' 
+1

¿Pero cómo aplicar cambios al servidor remoto? – vikyd

+2

@Viky Pruebe 'git push --all origen --force' – user11153

+2

¡Funciona para mí! Estoy usando GitLab, tengo que Desproteger la rama antes de presionar el comando. – vikyd

10

Guardar la secuencia de comandos a continuación como ejemplo ~/.bin/git-replace-author y ejecutarlo usando, por ejemplo:

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

Sin argumentos, se actualiza todas las confirmaciones con su nombre a utilizar 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)

+0

Como una breve nota: '~/.bin /' debe estar dentro de los usuarios '$ PATH' y el archivo debe ser ejecutable, por lo que ejecutar : 'chmod + x ~/.bin/git-replace-author'. –

Cuestiones relacionadas