git-wrong-email
El correo correcto en cada repo
Ningún commit, push ni tag sale de tu máquina con el correo equivocado para ese repo.
Dices qué correos acepta cada carpeta y un hook global de git revisa el correo que git de verdad va a poner, no la configuración que debería ponerlo. Es un solo script de shell, sin dependencias, y cubre cualquier terminal, cliente gráfico o agente de código de la máquina.
$ git commit -m 'fix typo'
git-wrong-email: committer email is '[email protected]', which this repository does not accept.
Repository: /Users/you/code/my-blog
Allowed: [email protected] [email protected]
Check: git config --show-origin user.email
El commit no se hace, y el mensaje dice qué correo esperaba y dónde mirar de dónde salió el otro.
Revisa el resultado, no la configuración
Da igual cómo llegó el correo equivocado: un user.email global reescrito por un cliente gráfico, un includeIf que no matchea lo que creías, una variable de entorno o un repo clonado en la carpeta que no era.
El push es la última puerta
pre-push vuelve a leer cada commit que el remoto todavía no tiene, y el tagger de cada tag anotado. Así atrapa lo que entró con --no-verify, por un cliente que se saltó el hook o con un rebase.
Global, sin apagar los hooks de cada repo
Se instala con core.hooksPath, así que cubre todos los repos de la máquina, también los que clones mañana. Después de su chequeo corre el hook propio del repo, y si ya usabas husky o lefthook, los sigue llamando.
Un diagnóstico antes del primer error
doctor cruza las reglas con tus includeIf y con los repos ya clonados: una regla que nunca va a aplicar, un includeIf sin regla o al revés. Para cada problema da el comando que lo arregla.
Tengo los proyectos de cada cliente y los personales en carpetas separadas, y un includeIf en ~/.gitconfig elige la identidad de cada una. Funcionó hasta que un cliente gráfico de git reescribió mi user.email global con el correo de un cliente. Mis repos personales empezaron a firmar con ese correo, y me enteré por un historial público.
includeIf asigna una identidad, pero no avisa cuando lo que debía asignarla no lo hizo. user.useConfigOnly evita que git adivine un correo, pero no detecta uno configurado y equivocado. Los hooks del framework pre-commit hay que meterlos en cada repo, y los plugins de editor solo cubren ese editor. Ninguno revisaba lo que de verdad sale.
La historia que el remoto ya tiene no se juzga: ya es pública, y bloquear un push por commits que nadie puede arreglar solo enseña a usar --no-verify. La historia completa está en por qué existe y cómo funciona.
Con Homebrew
install copia el hook y apunta core.hooksPath a él, sin escribir nada dentro de ningún repo. Después de cada brew upgrade hay que correrlo otra vez.
brew install neosergio/tap/git-wrong-email
git wrong-email install
$EDITOR ~/.config/git-wrong-email/rules
git wrong-email doctor
Sin Homebrew
git clone https://github.com/neosergio/git-wrong-email
cd git-wrong-email
./bin/git-wrong-email install
Una regla por línea: una carpeta y los correos que acepta. Gana la primera carpeta que contiene al repo, así que las específicas van arriba y * al final. Un repo que no matchea ninguna regla se rechaza.
# ~/.config/git-wrong-email/rules
~/work/acme/ [email protected]
~/code/ [email protected] [email protected]
* [email protected] [email protected]
Revisar que las reglas, los includeIf y los repos clonados dicen lo mismo:
git wrong-email doctor
Dónde está todo y si está activo. Dentro de un repo, avisa si ese repo tiene su propio core.hooksPath y apaga el chequeo:
git wrong-email status
Aceptar en un repo los commits de otra persona, solo como autora:
git config --add wrongEmail.allowedAuthor [email protected]
Quitar los hooks y devolver core.hooksPath a como estaba. Tus reglas se quedan:
git wrong-email uninstall
El paso a paso para dar de alta un cliente nuevo (carpeta, includeIf, regla, llave SSH) está en el README.
macOS o Linux
git, y nada más: es un script POSIX
¿Lo estás usando?
Me sirve saber dónde no encaja: un correo equivocado que se le escapó, un rechazo que no debía pasar, o un gestor de hooks con el que no se lleva bien.
Abrir un issue