Використовуйте виконуваний файл 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.