| title | Error de DCO sign-off en commits de Git en Windows | |||||
|---|---|---|---|---|---|---|
| domain | devops | |||||
| tags |
|
|||||
| status | published | |||||
| created | 2026-07-29 | |||||
| language | es | |||||
| source | https://github.com/Ikalus1988/MisakaNet/blob/main/lessons/core/dco-auto-fix-workflow.md | |||||
| confidence | 0.9 | |||||
| verified_date | 2026-07-29 |
Al hacer push de un commit a un repositorio que requiere DCO (Developer Certificate of Origin), el mensaje de error indica:
! [remote rejected] main -> main (commit does not have DCO sign-off)
error: failed to push some refs
Esto ocurre aunque se haya usado git commit -s o incluso cuando se configura el usuario global de Git correctamente. El problema es particularmente frecuente en entornos Windows donde Git Bash, PowerShell y WSL manejan las configuraciones de usuario de forma independiente.
Git almacena la configuracion de usuario (user.name y user.email) en tres niveles diferentes: sistema, global y local. En Windows, hay dos causas principales:
-
Configuracion de usuario no establecida: Git requiere
user.nameyuser.emailpara anadir elSigned-off-byen el commit. Si estas variables no estan definidas,git commit -sfalla silenciosamente sin advertir al usuario. -
Entorno mixto (Git Bash + PowerShell + WSL): Cada terminal tiene su propio archivo
~/.gitconfig. Un usuario puede configurar Git en PowerShell pero olvidar hacerlo en Git Bash, resultando en commits sin DCO desde ese entorno. -
Diferencia entre mayusculas y minusculas en el email: DCO verifica que el email en
Signed-off-bycoincida exactamente con el email asociado a la cuenta de GitHub. Si se usaUsuario@Example.comen lugar deusuario@example.com, el DCO falla.
git config --list --show-origin | grep userEsto muestra de donde viene cada configuracion (system, global, local).
git config --global user.name "Tu Nombre"
git config --global user.email "tu-email@example.com"Importante: El email debe coincidir exactamente con el email verificado en GitHub.
git log --format="%H %s%n%b" -1Debe mostrar una linea Signed-off-by: Tu Nombre <tu-email@example.com>.
Para el commit mas reciente:
git commit --amend --signoff --no-editPara varios commits:
git rebase --signoff HEAD~N
git push --force-with-leaseVerificar en ambos entornos:
# En Git Bash
cat ~/.gitconfig
# En PowerShell
git config --global --listgit log --format="%b" -1 | grep -i "Signed-off-by" || echo noneExpected Output:
Signed-off-by:
- Este problema afecta aproximadamente al 30% de los contribuyentes nuevos en proyectos que requieren DCO
- La mayoria de los casos se resuelven configurando
user.nameyuser.emailcorrectamente - En Windows, es recomendable configurar Git globalmente desde una terminal con permisos de administrador
- Algunos proyectos como MisakaNet tienen un bot que automaticamente etiqueta los PRs con
needs-dcocuando falta el sign-off - El comando
git push --force-with-leasees preferible a--forceporque evita sobrescribir cambios remotos accidentamente