Użyj pliku wykonywalnego cygwin w skrypcie git bash

9

Mam .shskrypt, który klikam dwukrotnie, aby go uruchomić przez git dla Windows.

Teraz potrzebuję (imagemagick) convertod cygwina (który zainstalowałem) i nazywam to absolutną ścieżką - /c/cygwin64/bin/convert.exe- ale otrzymuję:

błąd krytyczny - wykryto niezgodność bazy cygheap. Ten problem jest prawdopodobnie spowodowany użyciem niekompatybilnych wersji biblioteki DLL cygwin.

Zawijanie rzeczywistego convertpołączenia w połączenie cygwin bash, a nawet w cmd.exepołączenie, nie pomaga. Jest to trochę dziwne, ponieważ czasami używam plików wykonywalnych cygwin bezpośrednio w .cmdskryptach i to zawsze działało.

Co mogę zrobić? Preferowane byłoby rozwiązanie, które ogranicza mój program do jednego pliku.

(Wiem, że prawdopodobnie mógłbym po prostu zainstalować natywną grafikę systemu Windows. Ale następnego dnia potrzebuję innego narzędzia cygwin w git-for-Win-Shellscript ... chciałbym też zrozumieć, co się tutaj dzieje. I tak, Prawdopodobnie sprawię, że git dla Windows stanie się przestarzały w moim miejscu pracy , jeśli to możliwe)

SomeDev
źródło
Nie mieszaj i nie łącz różnych produktów opartych na Cygwin. Zamiast tego użyj Cygwin git.
DavidPostill
Dzięki za komentarz. Nie było dla mnie oczywiste, że git dla Windows jest oparty na cygwin. Ciągle czytam „MinGW” .. „MSYS” itp., Co nie brzmi tak bardzo jak cygwin. Ale tylko z ciekawości: jakie inne produkty oparte są na cygwinie?
SomeDev,
I czy mam rację, że narzędzia UnxUtils / GnuWin32 pochodzą z systemu Windows? Czy to prawda, że ​​Microsoft pracuje nad jakimś „środowiskiem podobnym do Linuksa” w systemie Windows (włączając bash i może inne fajne rzeczy)?
SomeDev,
„Nie było dla mnie oczywiste, że git dla Windows jest oparty na cygwin”. Zgaduję na podstawie komunikatu o błędzie dll. Czy możesz sprawdzić, czy masz wiele kopii biblioteki DLL cygwin w swoim systemie?
DavidPostill
Windows 10 Anniversary Edition wprowadził nową funkcję o nazwie Windows Subsystem for Linux. Obejmuje bash. Nie używam systemu Windows 10, więc nie wiem, co jeszcze zawiera.
DavidPostill

Odpowiedzi:

7

błąd krytyczny - wykryto niezgodność bazy cygheap.

Ten problem jest prawdopodobnie spowodowany użyciem niekompatybilnych wersji biblioteki DLL cygwin.

Ten błąd jest spowodowany, ponieważ ścieżka Git dla Windows jest niezgodna z Cywin.

  • Obaj wykorzystanie /bini /usr/binale to mapa do różnych katalogów (ponieważ używają różnych tabel montowania).

  • Cywin spodziewa się znaleźć dll w /usr/bin/cygwin1.dll(i nie znajduje się w Git dla Windows)

  • Po jawnym uruchomieniu dowolnego polecenia Cygwin w bashpowłoce Git dla Windows Cygwin nie może znaleźć swojej biblioteki DLL i generuje powyższy komunikat o błędzie.

  • Zauważ, że mapowanie montowania /jest inne.

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

Nie ma innego rozwiązania, niż mieszanie i dopasowywanie narzędzi pochodnych od cygwina. Wybierz jeden i trzymaj się go.

DavidPostill
źródło
1
Dziękuję za wyjaśnienie. Co powiesz na rozwiązanie?
Jim G.
4
@JimG. Nie ma jednego, oprócz mieszania i dopasowywania narzędzi pochodnych od cygwina. Wybierz jeden i trzymaj się go.
DavidPostill
1
Nie jest to pomocne, ponieważ nie ma żadnych wskazówek, które mogłyby pomóc w rozwiązaniu problemu. Dzieje się tak u wielu osób, które nie mają wiedzy, aby ustalić, co je spowodowało.
Julian Knight
1
Niestety, teraz otrzymuję to wszystko ze wszystkim związanym z git. Zainstalowałem nowe wersje, ale nie używam cygwina wprost, po prostu git. Nie mogę nawet uruchomić linii cmd git. Nie mogę więc wyśledzić przyczyny problemu i go naprawić. Nadal pracuję nad tym, aby sprawdzić, czy to pomaga: github.com/desktop/desktop/issues/3096
Julian Knight
2
Naprawiono za pomocą rozwiązania w łączu github. Wyłącz ASLR dla wszystkich błędów plików wykonywalnych w Windows Exploit Protection. To wtedy działa. Nie trzeba odinstalowywać programu git dla systemu Windows. Zrobił to poprzez dodanie nazwy programu (np. Uname.exe) zamiast pełnej ścieżki.
Julian Knight
0

Miałem ten sam problem w systemie Windows 10. Zastanawiałem się, jak można mieć wiele wersji CygWin, podczas gdy nie mogę znaleźć nawet jednego cygwin.dll. GitExtensions-> Stash i Git Bash uległy awarii z różnymi komunikatami o błędach. Rozwiązanie jest tutaj: Przejdź do Windows Defender -> Kontrola aplikacji i przeglądarki -> Ochrona przed lukami w zabezpieczeniach. I wyłącz trzy opcje za pomocą ASLR. Następnie musisz ponownie uruchomić system, ale to naprawdę pomaga!

Ilya Denisov
źródło
jest to część sekcji komentarzy, nie odpowiada na pytanie.
Vishrant