Utilice el ejecutable cygwin en el script git bash

9

Tengo un .shscript en el que hago doble clic para que git lo ejecute para Windows.

Ahora necesito (imagemagick) convertde cygwin (que he instalado) y lo llamo con su ruta absoluta /c/cygwin64/bin/convert.exe, pero obtengo:

error fatal: se detectó una falta de coincidencia en la base de cygheap. Este problema probablemente se deba al uso de versiones incompatibles de la DLL de cygwin.

Ajustar la convertllamada real en una llamada de cygwin bash, o incluso en una cmd.exellamada, no ayuda. Esto es un poco extraño porque a veces uso ejecutables de cygwin directamente en .cmdscripts, y eso siempre funcionó.

¿Que puedo hacer? Se preferiría una solución que mantenga mi programa limitado a un archivo.

(Sé que probablemente podría simplemente instalar una imagen nativa de Windows. Pero al día siguiente necesito otra herramienta cygwin en un git-for-Win-Shellscript ... también, me gustaría entender qué está pasando aquí. Y, sí, Probablemente haré obsoleto git para Windows en mi lugar de trabajo , si es posible)

SomeDev
fuente
No mezcle y combine diferentes productos basados ​​en Cygwin. Use Cygwin git en su lugar.
DavidPostill
Gracias por tu comentario. Para mí no era obvio que git para Windows se basa en cygwin. Continuamente leo "MinGW" ... "MSYS", etc., que no suena tanto como cygwin. Pero solo por curiosidad: ¿qué otros productos se basan en cygwin?
SomeDev
¿Y tengo razón en que las herramientas UnxUtils / GnuWin32 son nativas de Windows? ¿Es cierto que Microsoft está trabajando en algún tipo de "entorno similar a Linux" en Windows (incluyendo una fiesta y tal vez otras cosas buenas)?
SomeDev
"No era obvio para mí que git para Windows se basa en cygwin" Supongo que basado en el mensaje de error dll. ¿Puede verificar si tiene múltiples capas de dll cygwin en su sistema?
DavidPostill
Windows 10 Anniversary Edition introdujo una nueva característica llamada Windows Subsystem para Linux. Incluye bash. No estoy ejecutando Windows 10, así que no sé qué más incluye.
DavidPostill

Respuestas:

7

error fatal: se detectó una falta de coincidencia en la base de cygheap.

Este problema probablemente se deba al uso de versiones incompatibles de la DLL de cygwin.

Este error se debe a que la ruta de Git para Windows es incompatible con Cywin.

  • Ambos usan /biny /usr/binpero estos se asignan a directorios diferentes (porque usan tablas de montaje diferentes).

  • Cywin espera encontrar el dll en /usr/bin/cygwin1.dll(y no se encuentra en Git para Windows)

  • Cuando ejecuta explícitamente cualquier comando de Cygwin en un bashshell de Git para Windows, Cygwin no puede encontrar su dll y genera el mensaje de error anterior.

  • Observe a continuación que la asignación de montaje para /es diferente.

Git para Windows:

DavidPostill@Hal MINGW64 ~
$ mount
C:/temp on /tmp type ntfs (binary,noacl,posix=0,usertemp)
C:/apps/Git on / type ntfs (binary,noacl,auto)
C:/apps/Git/usr/bin on /bin type ntfs (binary,noacl,auto)
C: on /c type ntfs (binary,noacl,posix=0,user,noumount,auto)
E: on /e type vfat (binary,noacl,posix=0,user,noumount,auto)
F: on /f type ntfs (binary,noacl,posix=0,user,noumount,auto)

DavidPostill@Hal MINGW64 ~
$ which cygwin1.dll
which: no cygwin1.dll in (/c/Users/DavidPostill/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/mingw64/bin:/usr/bin:/c/Users/DavidPostill/bin:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/apps/WSCC/Sysinternals Suite:/c/apps/WSCC/NirSoft Utilities:/c/apps/Calibre:/cmd:/mingw64/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl)

DavidPostill@Hal MINGW64 ~
$ /c/cygwin/bin/man
      1 [main] man (608) C:\cygwin\bin\man.exe: *** fatal error - cygheap base mismatch detected - 0x180301408/0x180304408.
This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facility
and delete all but the most recent version.  The most recent version *should*
reside in x:\cygwin\bin, where 'x' is the drive on which you have
installed the cygwin distribution.  Rebooting is also suggested if you
are unable to find another cygwin DLL.
Segmentation fault

Cygwin:

$ mount
C:/cygwin/bin on /usr/bin type ntfs (binary,auto)
C:/cygwin/lib on /usr/lib type ntfs (binary,auto)
C:/cygwin on / type ntfs (binary,auto)
C: on /c type ntfs (binary,posix=0,user,noumount,auto)
E: on /e type vfat (binary,posix=0,user,noumount,auto)
F: on /f type ntfs (binary,posix=0,user,noumount,auto)
$ which cygwin1.dll
/usr/bin/cygwin1.dll
$ /c/cygwin/bin/man
What manual page do you want?

No hay solución, aparte de no mezclar y combinar utilidades derivadas de cygwin. Elige uno y quédate con él.

DavidPostill
fuente
1
Gracias por la explicación. ¿Qué tal una solución?
Jim G.
44
@JimG. No hay uno, aparte de no mezclar y combinar utilidades derivadas de cygwin. Elige uno y quédate con él.
DavidPostill
1
No es útil ya que no hay punteros para ayudar con una solución. Esto está ocurriendo para muchas personas que no tienen el conocimiento para averiguar qué lo causó.
Julian Knight
1
Desafortunadamente, ahora estoy obteniendo esto con todo lo relacionado con git. He instalado nuevas versiones pero no estoy usando cygwin explícitamente, solo git. Ni siquiera puedo comenzar la línea git cmd. Así que no puedo localizar qué está causando el problema y solucionarlo. Todavía estoy
Julian Knight
2
Solucionado a través de la solución en el enlace github. Desactive ASLR para todos los ejecutables con errores en Protección contra vulnerabilidades de Windows. Entonces funciona. No es necesario desinstalar git para Windows. Lo hizo agregando el nombre del programa (por ejemplo, uname.exe) en lugar de la ruta completa.
Julian Knight
0

Tuve el mismo problema en Windows 10. Me preguntaba cómo es posible tener muchas versiones de CygWin, aunque no puedo encontrar ni un solo cygwin.dll. Extensiones Git-> Stash y Git Bash se bloquearon con diferentes mensajes de error. La solución está aquí: vaya a Windows Defender -> Aplicación y control del navegador -> Protección contra exploits. Y apague tres opciones con ASLR. Debe reiniciar su sistema a partir de entonces, ¡pero realmente ayuda!

Ilya Denisov
fuente
Esta es una parte de la sección de comentarios, no responde la pregunta.
Vishrant