es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo generar y aplicar parches de git correctamente en Powershell (en lugar de bash)?

Por favor, observe el siguiente escenario corto (esto es en Powershell):

PS> git diff -U3 -r -M HEAD -- .\Metadata\LegacyTypeModules\xyz.Web.Main.draft.json | Out-File -Encoding ascii c:\temp\1.diff

PS> git apply --cached C:\temp\1.diff
error: patch failed: Metadata/LegacyTypeModules/xyz.Web.Main.draft.json:69
error: Metadata/LegacyTypeModules/xyz.Web.Main.draft.json: patch does not apply

Esto falla porque la última línea del archivo no termina con CRLF:

Enlace de la imagen

Sin embargo, los mismos comandos exactos funcionan cuando se ejecutan en bash:

$ git diff -U3 -r -M HEAD -- Metadata/LegacyTypeModules/xyz.Web.Main.draft.json > /c/Temp/2.diff

$ git apply --cached /c/Temp/2.diff

P11F70F@L-R910LPKW MINGW64 /c/xyz/tip (arch/1064933)

La diferencia entre los dos parches es:

Enlace de la imagen

Entonces, el problema parece ocurrir porque Powershell termina cada línea que pasa a través de la tubería con CRLF, mientras que bash conserva los finales de línea originales.

Entiendo por qué sucede esto: Powershell opera con objetos y los objetos son cadenas excluyendo los caracteres de fin de línea. Al escribir en un archivo, Powershell convierte los objetos en cadenas (en el caso de las cadenas, la conversión es nula) y utiliza la secuencia de fin de línea predeterminada para delimitar las líneas.

¿Significa esto que Powershell no se puede usar en escenarios sensibles a los finales de línea?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No, esto no significa que Powershell no pueda ser utilizado en absoluto en escenarios sensibles al final de línea. El problema en este caso no está en Powershell en sí, sino en el comportamiento predeterminado del cmdlet Out-File, que usa la secuencia de final de línea predeterminada para delimitar las líneas al escribir en un archivo. Sin embargo, Powershell puede manejar escenarios sensibles al final de línea utilizando el parámetro -NoNewline al escribir en un archivo, o utilizando otros métodos que conserven los finales de línea originales, como Set-Content con los parámetros -NoNewline y -Encoding. Es importante ser consciente de posibles problemas de final de línea al trabajar con diferentes plataformas y herramientas, y elegir los métodos apropiados para manejarlos.

Comments are closed.