Utiliser l'exécutable cygwin dans le script git bash

9

J'ai un .shscript sur lequel je double-clique pour le faire exécuter par git pour Windows.

Maintenant, j'ai besoin (imagemagick) convertde cygwin (que j'ai installé) et je l'appelle avec son chemin absolu - /c/cygwin64/bin/convert.exe- mais j'obtiens:

erreur fatale - non-concordance de la base cygheap détectée. Ce problème est probablement dû à l'utilisation de versions incompatibles de la DLL cygwin.

Envelopper l' convertappel réel dans un appel bash cygwin, ou même dans un cmd.exeappel, n'aide pas. C'est un peu étrange car j'utilise parfois des exécutables cygwin directement dans des .cmdscripts, et cela a toujours fonctionné.

Que puis-je faire? Une solution qui limiterait mon programme à un seul fichier serait préférable.

(Je sais que je pourrais probablement simplement installer imagemagick natif de Windows. Mais le lendemain, j'ai besoin d'un autre outil cygwin dans un git-for-Win-Shellscript .. aussi, j'aimerais comprendre ce qui se passe ici. Et, oui, Je vais probablement rendre git pour Windows obsolète sur mon lieu de travail , si possible)

SomeDev
la source
Ne mélangez pas et ne faites pas correspondre différents produits basés sur Cygwin. Utilisez plutôt Cygwin git.
DavidPostill
Merci pour votre commentaire. Il n'était pas évident pour moi que git pour Windows soit basé sur cygwin. Je lis continuellement "MinGW" .. "MSYS" etc. qui ne ressemble pas tellement à cygwin. Mais juste pour la curiosité: quels autres produits sont basés sur cygwin?
SomeDev
Et ai-je raison de dire que les outils UnxUtils / GnuWin32 sont natifs de Windows? Est-il vrai que Microsoft travaille sur une sorte d '"environnement de type Linux" dans Windows (y compris un bash et peut-être d'autres bonnes choses)?
SomeDev
"Il n'était pas évident pour moi que git pour Windows soit basé sur cygwin" Je suppose en me basant sur le message d'erreur dll. Pouvez-vous vérifier si vous avez plusieurs copies de la DLL cygwin sur votre système?
DavidPostill
Windows 10 Anniversary Edition a introduit une nouvelle fonctionnalité appelée Windows Subsystem for Linux. Il comprend bash. Je n'exécute pas Windows 10, donc je ne sais pas ce qu'il comprend d'autre.
DavidPostill

Réponses:

7

erreur fatale - non-concordance de la base cygheap détectée.

Ce problème est probablement dû à l'utilisation de versions incompatibles de la DLL cygwin.

Cette erreur est due au fait que le chemin Git pour Windows est incompatible avec Cywin.

  • Ils utilisent tous deux /binet /usr/binmais ces mappages vers des répertoires différents (car ils utilisent des tables de montage différentes).

  • Cywin s'attend à trouver la DLL /usr/bin/cygwin1.dll(et ne se trouve pas dans Git pour Windows)

  • Lorsque vous exécutez explicitement une commande Cygwin dans un bashshell Git pour Windows , Cygwin ne peut pas trouver sa DLL et génère le message d'erreur ci-dessus.

  • Notez ci-dessous que le mappage de montage pour /est différent.

Git pour 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?

Il n'y a pas de solution, à part ne pas mélanger et faire correspondre les utilitaires dérivés de cygwin. Choisissez en un et gardez le.

DavidPostill
la source
1
Merci pour l'explication. Et une solution?
Jim G.
4
@JimG. Il n'y en a pas d'autre que de ne pas mélanger et assortir les utilitaires dérivés de cygwin. Choisissez en un et gardez le.
DavidPostill
1
Pas utile car il n'y a pas de pointeurs pour aider avec une solution. Cela se produit pour de nombreuses personnes qui n'ont pas les connaissances nécessaires pour déterminer la cause.
Julian Knight
1
Malheureusement, je reçois maintenant cela avec tout ce qui est associé à git. J'ai installé de nouvelles versions mais je n'utilise pas explicitement cygwin, juste git. Je ne peux même pas démarrer la ligne git cmd. Je ne peux donc pas localiser la cause du problème et le résoudre. Travaille toujours à travers cela pour voir si cela aide: github.com/desktop/desktop/issues/3096
Julian Knight
2
Fixé via la solution dans le lien github. Désactivez ASLR pour tous les exécutables en erreur dans Windows Exploit Protection. Cela fonctionne alors. Pas besoin de désinstaller git pour Windows. Il l'a fait en ajoutant le nom du programme (par exemple uname.exe) plutôt que le chemin complet.
Julian Knight
0

J'ai eu le même problème sur Windows 10. Je me demandais comment est-il possible d'avoir beaucoup de versions de CygWin, alors que je ne trouve même pas un cygwin.dll. GitExtensions-> Stash et Git Bash ont été bloqués avec des messages d'erreur différents. La solution est là: allez dans Windows Defender -> Contrôle des applications et du navigateur -> Protection contre les exploits. Et désactivez trois options avec ASLR. Vous devez redémarrer votre système par la suite, mais cela aide vraiment!

Ilya Denisov
la source
cela fait partie de la section des commentaires, ne répond pas à la question.
Vishrant