fix: añadir .gitattributes con eol=lf y troubleshooting CRLF (#1) #3
Reference in New Issue
Block a user
Delete Branch "fix/wsl-crlf-self-heal"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #1
Problema
set: usage:y `$al ejecutardeploy.sh`. Diagnóstico: el archivo llegaba con saltos de línea CRLF (Windows), no LF (Unix).Causa raíz
Sin un
.gitattributesen el repo, Git en Windows puede guardar.shcon CRLF (especialmente concore.autocrlf=true). Al ejecutar con bash, el\rfinal de cada línea se interpreta como parte del comando:set -e\r→ bash ve-e\rcomo opción inválida →set: usage:echo ...\r→ bash intenta ejecutar un comando\r→$ : command not foundexit 1se rompe →syntax error: unexpected end of fileFix
Dos cambios mínimos, sin tocar la lógica del script:
.gitattributes(nuevo) — fuerzaeol=lfen*.sh,*.bash,*.md,*.yml. Los clones futuros desde Windows llegan limpios.README.md— sección Troubleshooting con el workaroundsed -i s/\r$// deploy.shpara archivos ya descargados con CRLF.Por qué no auto-cura en el script
Probé varias estrategias (
sed -isobreBASH_SOURCE[0],execdesde temporal,evalcon keywords compactadas). Todas fallan porque bash parsea el script línea a línea y cualquier keyword (if/then/fi/while/do/done) precedida de\rrompe la sintaxis. Un script bash completo no puede auto-curarse de CRLF sin un wrapper externo. La solución correcta es atacar la raíz: que el archivo nunca llegue con CRLF.Verificación
Revisión — Flama
Fix correcto y bien diagnosticado. La solución ataca la raíz (
.gitattributesconeol=lf) en lugar de parchear el script, lo cual es la decisión correcta dado que bash no puede auto-curarse de CRLF por su naturaleza línea-a-línea.Observaciones menores
*.md text eol=lf—.gitattributeslo aplica también a Markdown. Está bien para consistencia, pero nota: si en algún momento alguien necesita exportar el README a un editor Windows que requiera CRLF, tendrá que convertirlo manualmente. Trade-off aceptable.Troubleshooting del README —
sed -i 's/ $//' deploy.shfunciona en GNU sed (WSL, Linux, macOS con coreutils). En macOS nativo singnu-sedinstalado, el-irequieresed -i '' 's/ $//' deploy.sh. Considera añadir una nota si esperas usuarios en macOS puro.Verificación propuesta en el body del PR — Está bien planteada, pero ¿podrías añadir un test automatizado (shellcheck + checkeol en CI) para que esto no vuelva a colarse? Ahora mismo, si alguien añade un
.shsin pasar por.gitattributes, volveremos al mismo problema.LGTM
Aprobado. Una vez mergeado, considerar hacer cherry-pick del fix a
storeroom-os,lcp-rrhhy otros repos del org que tengan.sho scripts sin.gitattributes.