Me gustaría cambiar mi nombre, apellido y correo electrónico en todas mis confirmaciones, ¿es posible?
Me gustaría cambiar mi nombre, apellido y correo electrónico en todas mis confirmaciones, ¿es posible?
Respuestas:
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_NAME
y 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.
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
msysgit
, todavía tiene acceso a bash
. De lo contrario, no tengo idea.
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 "$@"'
git push --all origin --force
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 "$@"'
Guarde el script a continuación como, por ejemplo, ~/.bin/git-replace-author
y 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)
~/.bin/
tiene que estar dentro de los usuarios $PATH
y las necesidades de archivo para ser ejecutable, por lo ejecute: chmod +x ~/.bin/git-replace-author
.
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.
Con Git 2.24 (Q4 2019), git filter-branch
(y BFG) está en desuso .
El equivalente sería, usando newren/git-filter-repo
, y su sección de ejemplo :
cd repo
git filter-repo --mailmap my-mailmap
con my-mailmap
:
Correct Name <correct@email.com> <old@email.com>
Eso reemplazaría el nombre del autor y el correo electrónico de cualquier compromiso realizado por cualquier persona con <old@email.com>
Vea la git shortlog
sección del autor de mapeo para la sintaxis exacta de