Використовуйте виконуваний файл cygwin у скрипті git bash


8

У мене є .shсценарій, який я двічі клацнув, щоб він виконувався git для Windows.

Тепер мені потрібен (imagemagick) convertвід cygwin (який я встановив), і я називаю його абсолютним шляхом - /c/cygwin64/bin/convert.exe- але я отримую:

фатальна помилка - виявлено невідповідність основи cygheap. Ця проблема, ймовірно, пов'язана з використанням несумісних версій DLL cygwin.

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

Що я можу зробити? Віддається перевага рішення, яке обмежує мою програму одним файлом.

(Я знаю, що, ймовірно, я міг би просто встановити вбудований у Windows Imagemagick. Але наступного дня мені потрібен ще один інструмент cygwin в git-for-Win-Shellscript. Також, я хотів би зрозуміти, що тут відбувається. І, так, Я, мабуть, зроблю git для Windows застарілим на своєму робочому місці , якщо це можливо)


Не змішуйте та не порівнюйте різні продукти на основі Cygwin. Використовуйте замість Cygwin git.
— DavidPostill

Дякуємо за ваш коментар Мені не було очевидно, що git для Windows заснований на cygwin. Я постійно читаю "MinGW" .. "MSYS" і т. Д., Який не дуже схожий на cygwin. Але тільки для цікавості: які ще продукти базуються на cygwin?
— SomeDev

І я маю рацію, що інструменти UnxUtils / GnuWin32 створені для Windows? Чи правда, що Microsoft працює над якоюсь "середовищем, схожою на Linux" у Windows (включаючи баш та, можливо, інші чудові речі)?
— SomeDev

"Мені не було очевидно, що git для Windows заснований на cygwin" Я здогадуюсь на основі повідомлення про помилку DLL. Чи можете ви перевірити, чи є у вас кілька копій dll cygwin у вашій системі?
— DavidPostill

Windows 10 Anniversary Edition представила нову функцію під назвою Підсистема Windows для Linux. Він включає баш. Я не запускаю Windows 10, тому не знаю, що ще воно включає.
— DavidPostill

Відповіді:


5

фатальна помилка - виявлено невідповідність основи cygheap.

Ця проблема, ймовірно, пов'язана з використанням несумісних версій DLL cygwin.

Ця помилка викликана тим, що шлях Git для Windows несумісний із Cywin.

  • Вони обидва використовують /binі /usr/binале ці карти в різні каталоги (бо вони використовують різні таблиці монтування).

  • Cywin розраховує знайти dll в /usr/bin/cygwin1.dll(і його не можна знайти в Git для Windows)

  • Коли ви явно запускаєте будь-яку команду Cygwin в bashоболонці Git для 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
Дякую за пояснення. Як щодо рішення?
— Джим Г.

2
@JimG. Немає жодної, крім того, щоб не змішувати і не узгоджувати утиліти, що походять від cygwin. Виберіть один і дотримуйтесь його.
— DavidPostill

1
Не корисно, оскільки немає вказівників, які б допомогли знайти рішення. Це трапляється для багатьох людей, які не мають знань, щоб розробити, що це спричинило.
— Джуліан Найт

@JulianKnight Дивіться мій попередній коментар. Я оновив відповідь.
— DavidPostill

1
Фіксується за допомогою розчину в github-ланці. Вимкніть ASLR для всіх виконуваних файлів помилок у Windows Exploit Protection. Потім це працює. Не потрібно видаляти git для Windows. Це було зроблено, додавши назву програми (наприклад, uname.exe), а не повний шлях.
— Джуліан Найт

0

У мене була така ж проблема в Windows 10. Мені було цікаво, як можливо мати багато версій CygWin, в той час як я не можу знайти навіть одного cygwin.dll. GitExtensions-> Stash та Git Bash були розбиті різними повідомленнями про помилки. Рішення тут: Перейдіть до програми Windows Defender -> Керування додатками та браузером -> Використання захисту. І вимкніть три варіанти з ASLR. Ви повинні перезапустити систему після цього, але це дійсно допомагає!


це частина розділу коментарів, не відповідає на запитання.
— Вишрант
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.