Используйте исполняемый файл cygwin в скрипте git bash

9

У меня есть .shскрипт, который я дважды щелкаю, чтобы он выполнялся git для Windows.

Теперь мне нужно (imagemagick) convertот Cygwin (который я установил), и я называю его с абсолютным путем - /c/cygwin64/bin/convert.exe- но я получаю:

фатальная ошибка - обнаружено несоответствие базы Cygheap. Эта проблема, вероятно, связана с использованием несовместимых версий библиотеки cygwin.

Перенос фактического convertвызова в вызове cygwin bash или даже в cmd.exeвызове не помогает. Это немного странно, потому что я иногда использую исполняемые файлы cygwin непосредственно в .cmdскриптах, и это всегда работало.

Что я могу сделать? Решение, которое ограничивает мою программу одним файлом, было бы предпочтительным.

(Я знаю, что, возможно, я мог бы просто установить родной имидж-образ Windows. Но на следующий день мне нужен еще один инструмент cygwin в git-for-Win-Shellscript ... также, я бы хотел понять, что здесь происходит. И да, Возможно, я сделаю git для Windows устаревшим на своем рабочем месте , если это возможно)

SomeDev
источник
Не смешивайте и не сочетайте разные продукты на основе Cygwin. Используйте вместо этого Cygwin git.
DavidPostill
Спасибо за ваш комментарий. Для меня не было очевидным, что Git для Windows основан на Cygwin. Я постоянно читаю "MinGW" .. "MSYS" и т. Д., Который не очень похож на Cygwin. Но просто для любопытства: какие еще продукты основаны на Cygwin?
SomeDev
И прав ли я, что инструменты UnxUtils / GnuWin32 являются родными для Windows? Правда ли, что Microsoft работает над некой «Linux-подобной средой» в Windows (включая bash и, возможно, другие замечательные вещи)?
SomeDev
«Для меня не было очевидным, что git для Windows основан на Cygwin», я думаю, основываясь на сообщении об ошибке DLL. Можете ли вы проверить, есть ли в вашей системе несколько копий библиотеки cygwin?
DavidPostill
В Windows 10 Anniversary Edition появилась новая функция под названием «Подсистема Windows для Linux». Это включает в себя Bash. У меня не работает Windows 10, поэтому я не знаю, что еще она включает.
DavidPostill

Ответы:

7

фатальная ошибка - обнаружено несоответствие базы Cygheap.

Эта проблема, вероятно, связана с использованием несовместимых версий библиотеки cygwin.

Эта ошибка вызвана тем, что путь Git для Windows несовместим с Cywin.

  • Они оба используют /binи /usr/binно эти карты в разные каталоги (потому что они используют различные таблицы монтирования).

  • Cywin ожидает найти DLL в /usr/bin/cygwin1.dll(и не найден в Git для Windows)

  • Когда вы явно запускаете любую команду Cygwin в bashоболочке Git for Windows, Cygwin не может найти свою dll и генерирует сообщение об ошибке выше.

  • Обратите внимание, что отображение монтирования для /отличается.

Git для 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?

Нет другого решения, кроме как не смешивать и сопоставлять утилиты, полученные из Cygwin. Выберите один и придерживайтесь его.

ДэвидПостилл
источник
1
Спасибо за объяснение. Как насчет решения?
Джим Г.
4
@JimG. Там нет ни одного, кроме как не смешивать и сочетать производные от Cygwin утилиты. Выберите один и придерживайтесь его.
DavidPostill
1
Не полезно, так как нет указателей, чтобы помочь с решением. Это происходит для многих людей, у которых нет знаний, чтобы понять, что вызвало это.
Джулиан Найт
1
К сожалению, теперь я получаю это со всем, что связано с git. Я установил новые версии, но я явно не использую cygwin, просто git. Я даже не могу запустить строку git cmd. Поэтому я не могу отследить причину проблемы и устранить ее. Все еще работаем над этим, чтобы посмотреть, поможет ли это: github.com/desktop/desktop/issues/3096
Джулиан Найт,
2
Исправлено через решение в ссылке на github. Отключите ASLR для всех исполняемых файлов с ошибками в Windows Exploit Protection. Это тогда работает. Нет необходимости удалять git для Windows. Это было сделано путем добавления имени программы (например, uname.exe), а не полного пути.
Джулиан Найт
0

У меня была та же проблема на Windows 10. Мне было интересно, как можно иметь много версий CygWin, в то время как я не могу найти даже один cygwin.dll. GitExtensions-> Stash и Git Bash были сбой с различными сообщениями об ошибках. Решение здесь: перейдите в Защитник Windows -> Управление приложениями и браузерами -> Защита от эксплойтов. И отключите три варианта с ASLR. Вы должны перезагрузить свою систему после этого, но это действительно помогает!

Илья Денисов
источник
это часть раздела комментариев, не отвечает на вопрос.
Вишрант