SPAM. SPiced HAM

Cambiar el correo en commits de un repositorio en GitHub

Si tienes un repositorio de GitHub de hace años, es probable que alguna vez, sea por error o intencional, hayas puesto tu correo personal en el mensaje de commit. A pesar que GitHub se esfuerza porque el correo no se publique directamente a través de su web, cualquier spammer puede hacerse con el consultando el API o bien clonando el repositorio y mirando los mensajes del log.

GitHub da además una dirección de tipo: USUARIO@users.noreply.github.com.

Esto puede ayudar un poco con el spam, sobre todo si quieres cambiar de correo y no poner el nuevo en los commits.

En este caso vamos a ver como hacerlo con todos los commits o sólo con algunos en concreto.

Ten en cuenta que estos comandos romperán los repositorios de otros miembros de tu equipo, lo ideal es emplearlos para aquellos que son sólo tuyos.

Aviso: Tu email antiguo quedará en otros commits a otros repositorios, si han hecho forks, etc.

Opciones de privacidad en GitHub

Paso 0: Vamos a GitHub y en Tu perfil de usuario -> Settings -> Email. Ahí seleccionamos los dos checkboxes:

  • Keep my email addresses private.
  • Block command line pushes that expose my email.
GitHub: Opciones de privacidad del email

Configuración global de git

Paso 1: Debemos cambiar el autor y el email por defecto en git de forma global que se usarán a partir de ahora en los commits:

git config --global user.name "Jose Sanchez"
git config --global user.email "USUARIO@users.noreply.github.com"

En el caso que estuviésemos firmando los commits, es bastante conveniente deshacer la firma para evitar problemas. Ojo, bastaría con volver a firmar si sólo eres tú el que ha participado en el repositorio.

Paso 2: Quitar signingkey:

git config --global --unset user.signingkey
git config --global commit.gpgsign false

Modificando el repositorio desde el inicio

Paso 3. Opción 1: En el caso de querer afectar a TODOS los commits desde el inicio, para cada repositorio donde quieres hacer esto:

git clone git@github.com:USUARIO/REPOSITORIO.git
cd REPOSITORIO
git rebase -r --root --exec "git commit --amend --no-edit --reset-author"
git push -f

Modificando sólo algunos commits

Paso 3. Opción 2: En el caso que no quieras que afecte a todo:

git rebase -r ultimo_commit_correcto --exec 'git commit --amend --no-edit --reset-author'

Paso 3: Opción 3: Con un script, que se sugiere en: https://www.git-tower.com/learn/git/faq/change-author-name-email podemos cambiar también el correo y el nombre del autor:

git filter-branch --env-filter '
WRONG_EMAIL="wrong@example.com"
NEW_NAME="New Name Value"
NEW_EMAIL="correct@example.com"

if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
export GIT_COMMITTER_NAME="$NEW_NAME"
export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
export GIT_AUTHOR_NAME="$NEW_NAME"
export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

El script anterior, aunque funciona, genera una advertencia:

WARNING: git-filter-branch has a glut of gotchas generating mangled history
rewrites. Hit Ctrl-C before proceeding to abort, then use an
alternative filtering tool such as ‘git filter-repo’
(https://github.com/newren/git-filter-repo/) instead. See the
filter-branch manual page for more details; to squelch this warning,
set FILTER_BRANCH_SQUELCH_WARNING=1.

Opción sólo para el último commit

Por último, hay una opción mejor si sólo queremos corregir el último commit:

git commit --amend --no-edit --reset-author

Confirmando cambios

Paso final: Tenemos que forzar el push, ya que de lo contrario no nos admitiría «empujar» cambios que modificasen de esa manera el histórico.

git push -f

Conclusiones:

Este tipo de cambios son peligrosos y ROMPEN el estado del repositorio para otra gente que lo tenga clonado. Lo más fácil es que cojan sus cambios, clonen el repositorio de nuevo y los apliquen.

Evitar exponer tu email a más spam puede ser una buena práctica, aunque la triste realidad es que una vez en una lista, difícilmente recibas menos spam.

Webs con más información: