infante..io
Icono de git-wrong-email

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.

Instalar

v0.2.2 ·macOS y Linux · Código abierto (MIT) ·GitHub

$ 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.

Qué hace

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.

Por qué existe

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.

Shell Git Homebrew CLI Open source
Instalar

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
Cómo se usa

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.

Requisitos

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