Usa l'eseguibile cygwin nello script git bash


9

Ho uno .shscript che faccio doppio clic per farlo eseguire da Git per Windows.

Ora ho bisogno di (imagemagick) convertda cygwin (che ho installato) e lo chiamo con il suo percorso assoluto - /c/cygwin64/bin/convert.exe- ma ottengo:

errore irreversibile - rilevata mancata corrispondenza della base cygheap. Questo problema è probabilmente dovuto all'utilizzo di versioni incompatibili della DLL cygwin.

Il wrapping della convertchiamata effettiva in una chiamata bash cygwin o anche in una cmd.exechiamata non aiuta. Questo è un po 'strano perché a volte uso gli eseguibili cygwin direttamente negli .cmdscript e ha sempre funzionato.

Cosa posso fare? Sarebbe preferibile una soluzione che limiti il ​​mio programma a un solo file.

(So ​​che probabilmente potrei semplicemente installare imagemagick nativo di Windows. Ma poi il giorno dopo ho bisogno di un altro strumento Cygwin in un git-for-Win-Shellscript .. Inoltre, mi piacerebbe capire cosa sta succedendo qui. E, sì, Probabilmente renderò obsoleto git per Windows sul mio posto di lavoro , se possibile)


Non mescolare e abbinare diversi prodotti basati su Cygwin. Utilizzare invece Cygwin git.
DavidPostill

Grazie per il tuo commento. Non era ovvio per me che Git per Windows sia basato su Cygwin. Leggo continuamente "MinGW" .. "MSYS" ecc. Che non suona così tanto come Cygwin. Ma solo per curiosità: quali altri prodotti sono basati su Cygwin?
SomeDev

E ho ragione che gli strumenti UnxUtils / GnuWin32 sono nativi di Windows? È vero che Microsoft sta lavorando su una sorta di "ambiente simile a Linux" in Windows (incluso un bash e forse altre cose belle)?
SomeDev

"Non era ovvio per me che Git per Windows sia basato su Cygwin" Sto indovinando in base al messaggio di errore DLL. Puoi verificare se sul tuo sistema sono presenti più copie della dll cygwin?
DavidPostill

Windows 10 Anniversary Edition ha introdotto una nuova funzionalità chiamata Sottosistema Windows per Linux. Include bash. Non eseguo Windows 10, quindi non so cos'altro include.
DavidPostill

Risposte:


7

errore irreversibile - rilevata mancata corrispondenza della base cygheap.

Questo problema è probabilmente dovuto all'utilizzo di versioni incompatibili della DLL cygwin.

Questo errore è causato perché il percorso Git per Windows non è compatibile con Cywin.

  • Entrambi utilizzano /bine, /usr/bintuttavia, si associano a directory diverse (perché utilizzano tabelle di montaggio diverse).

  • Cywin prevede di trovare la dll /usr/bin/cygwin1.dll(e non si trova in Git per Windows)

  • Quando si esegue esplicitamente qualsiasi comando Cygwin in una bashshell Git per Windows , Cygwin non riesce a trovare la sua dll e genera il messaggio di errore sopra.

  • Si noti di seguito che la mappatura di mount per /è diversa.

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

Non esiste soluzione se non quella di non mischiare e abbinare i programmi di utilità derivati ​​da Cygwin. Scegline uno e attaccalo.


1
Grazie per la spiegazione. Che ne dici di una soluzione?
Jim G.

4
@JimG. Non ce n'è uno, a parte il non mescolare e abbinare i programmi di utilità derivati ​​da Cygwin. Scegline uno e mantienilo.
David Post

1
Non utile in quanto non ci sono puntatori per aiutare con una soluzione. Questo sta accadendo per molte persone che non hanno le conoscenze per capire cosa l'ha causato.
Julian Knight,

1
Sfortunatamente, ora lo sto ottenendo con tutto ciò che è associato a Git. Ho installato nuove versioni ma non sto usando Cygwin esplicitamente, solo Git. Non riesco nemmeno a iniziare la linea cmd git. Quindi non riesco a rintracciare ciò che sta causando il problema e risolverlo. Ancora lavorando su questo per vedere se aiuta: github.com/desktop/desktop/issues/3096
Julian Knight

2
Risolto tramite la soluzione nel collegamento github. Disattiva ASLR per tutti gli eseguibili con errori in Protezione exploit di Windows. Quindi funziona. Non è necessario disinstallare git per Windows. Lo ha fatto aggiungendo il nome del programma (ad esempio uname.exe) anziché il percorso completo.
Julian Knight,

0

Ho avuto lo stesso problema su Windows 10. Mi chiedevo come sia possibile avere molte versioni di CygWin, mentre non riesco a trovare nemmeno un cygwin.dll. GitExtensions-> Stash e Git Bash sono stati arrestati in modo anomalo con diversi messaggi di errore. La soluzione è qui: vai su Windows Defender -> Controllo app e browser -> Protezione dagli exploit. E disattiva tre opzioni con ASLR. Successivamente è necessario riavviare il sistema, ma aiuta davvero!


questa è una parte della sezione commenti, non risponde alla domanda.
Vishrant
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.