Use o executável cygwin no script git bash

9

Eu tenho um .shscript que clico duas vezes para executá-lo pelo git para Windows.

Agora eu preciso (imagemagick) convertdo cygwin (que eu instalei) e estou chamando-o com seu caminho absoluto - /c/cygwin64/bin/convert.exe- mas eu recebo:

erro fatal - incompatibilidade de base do cygheap detectada. Esse problema provavelmente ocorre devido ao uso de versões incompatíveis da DLL do cygwin.

Encerrar a convertchamada real em uma chamada cygwin bash, ou mesmo em uma cmd.exechamada, não ajuda. Isso é um pouco estranho, porque às vezes uso executáveis ​​do cygwin diretamente em .cmdscripts, e isso sempre funcionou.

O que eu posso fazer? Uma solução que mantenha meu programa limitado a um arquivo seria a preferida.

(Eu sei que provavelmente poderia instalar o imagemagick nativo do Windows. Mas, no dia seguinte, preciso de outra ferramenta cygwin em um git-for-Win-Shellscript. Além disso, eu gostaria de entender o que está acontecendo aqui. Provavelmente tornarei o git for Windows obsoleto no meu local de trabalho , se possível)

SomeDev
fonte
Não misture e combine produtos diferentes com base no Cygwin. Use Cygwin git.
DavidPostill
Obrigado por seu comentário. Não era óbvio para mim que o git para Windows é baseado no cygwin. Eu leio continuamente "MinGW" .. "MSYS" etc., que não parece muito com o cygwin. Mas apenas por curiosidade: que outros produtos são baseados no cygwin?
SomeDev
E estou certo de que as ferramentas UnxUtils / GnuWin32 são nativas do Windows? É verdade que a Microsoft está trabalhando em algum tipo de "ambiente semelhante ao Linux" no Windows (incluindo uma festa e talvez outras coisas boas)?
SomeDev
"Não era óbvio para mim que o git para Windows é baseado no cygwin", suponho que seja com base na mensagem de erro da dll. Você pode verificar se você tem várias cópias da dll cygwin no seu sistema?
DavidPostill
O Windows 10 Anniversary Edition introduziu um novo recurso chamado Windows Subsystem for Linux. Inclui bash. Não estou executando o Windows 10, então não sei mais o que ele inclui.
DavidPostill

Respostas:

7

erro fatal - incompatibilidade de base do cygheap detectada.

Esse problema provavelmente ocorre devido ao uso de versões incompatíveis da DLL do cygwin.

Este erro é causado porque o caminho do Git for Windows é incompatível com o Cywin.

  • Ambos usam /bine, /usr/binporém, são mapeados para diretórios diferentes (porque usam tabelas de montagem diferentes).

  • O Cywin espera encontrar a dll em /usr/bin/cygwin1.dll(e não é encontrada no Git for Windows)

  • Quando você executa explicitamente qualquer comando Cygwin em um bashshell do Git for Windows , o Cygwin não consegue encontrar sua DLL e gera a mensagem de erro acima.

  • Observe abaixo que o mapeamento de montagem para /é 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?

Não há solução, a não ser não misturar e combinar utilitários derivados do cygwin. Escolha um e fique com ele.

DavidPostill
fonte
11
Obrigada pelo esclarecimento. Que tal uma solução?
Jim G.
4
@JimG. Não existe um, além de não misturar e combinar utilitários derivados do cygwin. Escolha um e fique com ele.
DavidPostill
11
Não é útil, pois não há indicadores para ajudar com uma solução. Isso está ocorrendo para muitas pessoas que não têm conhecimento para descobrir o que causou isso.
Julian Knight
11
Infelizmente, agora estou conseguindo isso com tudo associado ao git. Instalei novas versões, mas não estou usando o cygwin explicitamente, apenas o git. Não consigo nem iniciar a linha git cmd. Portanto, não consigo rastrear o que está causando o problema e corrigi-lo. Ainda trabalhando para verificar se isso ajuda: github.com/desktop/desktop/issues/3096
Julian Knight
2
Corrigido através da solução no link do github. Desative o ASLR para todos os executáveis ​​com erro no Windows Exploit Protection. Então funciona. Não é necessário desinstalar o git para Windows. Isso foi feito adicionando o nome do programa (por exemplo, uname.exe) em vez do caminho completo.
Julian Knight
0

Eu tinha o mesmo problema no Windows 10. Eu queria saber como é possível ter várias versões do CygWin, enquanto não consigo encontrar nem mesmo um cygwin.dll. GitExtensions-> Stash e Git Bash foram travados com diferentes mensagens de erro. A solução está aqui: Vá para Windows Defender -> Controle de aplicativo e navegador -> Explorar proteção. E desligue três opções com o ASLR. Você precisa reiniciar o sistema posteriormente, mas isso realmente ajuda!

Ilya Denisov
fonte
isso faz parte da seção de comentários, não responde à pergunta.
Vishrant