Розширення Git: помилка Win32 487: Не вдалося зарезервувати простір для купи cygwin, помилка Win32 0


342

Розширення Git: до вчорашнього дня все працювало нормально.

Але раптом я отримую цю помилку, коли намагаюся витягнути деякі сховища за допомогою git extensions

C:\Program Files\Git\bin\git.exe pull --progress "origin" 
Done
    0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x68560000, RegionSize 0x390000, State 0x10000
C:\Program Files\Git\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0

Це відбувається для всіх сховищ, які я клонував. Але, мій git bash працює чудово. Я поняття не маю, що відбувається. Будь-яка ідея, чому це відбувається?


5
Cygwin дивний і використовує стійкі розділи пам'яті. Ви спробували перезавантажити систему?
Грег Хьюгілл

@GregHewgill: не перезавантажувався з кількох днів. Зробимо це відразу.
Uchia Itachi

1
@GregHewgill: Це спрацювало. Дякую, можливо, якщо ви опублікуєте це як відповідь, це буде корисно і для інших.
Uchia Itachi

Просто хотілося сказати, що ця помилка не характерна для git, і в погані дні cygwin збивається на будь-який виконуваний файл таким же чином без видимих ​​причин.
meneldal

1
ОП, ви повинні змінити обрану відповідь на відповідь @ Yirkha, оскільки вона вирішує першопричину проблеми. Це може врятувати деякі марні спроби майбутніх читачів (як це сталося зі мною).
ysap

Відповіді:


230

Cygwin використовує стійкі розділи пам’яті, які можуть з часом пошкодитися. Симптомом цього є те, що деякі програми Cygwin починають виходити з ладу, але інші програми не впливають. Оскільки ці розділи спільної пам’яті є стійкими, часто потрібно перезавантажити систему , щоб очистити їх, перш ніж проблему можна буде вирішити.


У випадку, якщо це комусь допоможе, я перемістив біт GitExtensions у своєму PATH, щоб стати першим пунктом, і, здається, він вирішив проблему для мене. (Я поклав собі git / cmd на 2-е місце - не впевнений, чи це було його частиною). Трохи простіше, ніж перезавантаження або перетасування файлу .dll.
jinglesthula

6
Чи не існує виконавчого файлу, який можна просто припинити, щоб звільнити пам'ять? Повна перезавантаження системи здається непосильною. Також відповідь нижче ( stackoverflow.com/a/31970708/88409 ) пояснює, у чому полягає насправді проблема, і вона не має нічого спільного з пошкодженою пам'яттю.
Трайко

379

У мене була така ж проблема. Я знайшов рішення тут http://jakob.engbloms.se/archives/1403

c:\msysgit\bin>rebase.exe -b 0x50000000 msys-1.0.dll

Для мене рішення було дещо іншим. Це було

C:\Program Files (x86)\Git\bin>rebase.exe -b 0x50000000 msys-1.0.dll

Перш ніж перезавантажувати dlls, переконайтеся, що вони не використовуються:

tasklist /m msys-1.0.dll

І зробіть резервну копію:

copy msys-1.0.dll msys-1.0.dll.bak

Якщо команда rebase не працює з чимось на зразок:

ReBaseImage (msys-1.0.dll) не вдався з останньою помилкою = 6

Вам потрібно буде виконати наступні дії для того, щоб:

  1. Скопіюйте dll в інший каталог
  2. Перезавантажте копію за допомогою команд, наведених вище
  3. Замініть оригінал dll на копію.

Якщо виникає проблема, запустіть команди як адміністратор


1
У моєму випадку я rebase.exe був у підкаталозі під / mingw, тому команда виявилася такою: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll, і я запустив її, перебуваючи в c: / msysgit / bin каталог.
Роберт Ошлер

8
Я даю цю помилку ReBaseImage (msys-1.0.dll) не вдалося з останньою помилкою = 6
TheJKFever

17
@TheJKЯк вам потрібно запустити його в командному рядку як адміністратор, оскільки він буде модифікувати msys-1.0.dll. Спершу зробіть резервну копію DLL, скопіюйте його в msys-1.0.dll.bak, після чого запустіть команду як адміністратор. Це працювало для мене.
Ніколаос Георгіу

1
Windows 8.1 говорить мені, що я не можу запустити цей виконуваний файл на цьому ПК, коли я намагаюся перезавантажити
Jules GM

2
У мене немає rebase.exe на своєму Win10 64 Bit Pro, але виклик наступного зробив трюк (VS2010): "C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe "/ ПОВЕРНЕННЯ: BASE = 0x50000000 msys-1.0.dll
Пол Бусман

136

tl; dr: Встановіть 64-бітний Git для Windows 2 .


Технічні деталі

      0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x68570000, RegionSize 0x2A0000, State 0x10000
PortableGit\bin\bash.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0

Цей симптом сам по собі не має нічого спільного з базами зображень виконуваних файлів, зіпсованими розділами спільної пам'яті Cygwin, конфліктними версіями DLL тощо.

Цей код Cygwin не в змозі виділити ~ 5 Мб великий фрагмент пам’яті для своєї купи за цією фіксованою адресою 0x68570000, тоді як, очевидно, там був доступний лише отвір розміром 2,5 Мб. Відповідний код можна побачити у джерелі msysgit .


Чому ця частина адресного простору не вільна?

Причин може бути багато. У моєму випадку це були деякі інші модулі, завантажені за конфліктною адресою:

Модулі процесів у Process Explorer

Остання адреса становитиме близько 0x68570000 + 5 MB = 0x68C50000, але є ці DLL-файли, пов’язані з WOW64, завантажені від 0x68810000 вгору, які блокують розподіл.

Щоразу, коли є якась спільна DLL, Windows взагалі намагається завантажити її на одну і ту ж віртуальну адресу у всіх процесах, щоб зберегти деяку обробку переїзду. Це просто невдача, що цього разу ці компоненти системи якось завантажилися на конфліктну адресу .


Чому у вашому Git є Cygwin?

Оскільки Git - це багатий набір, що складається з декількох команд низького рівня та безлічі корисних утиліт, і в основному розробляється на системах, схожих на Unix. Для того, щоб можна було створити його та запустити його без масового переписування, йому потрібно хоча б часткове середовище, схоже на Unix.

Для цього люди винайшли MinGW та MSYS - мінімальний набір інструментів побудови для розробки програм у Windows на зразок Unix. MSYS також містить спільну бібліотеку, msys-1.0.dllяка допомагає вирішити деякі проблеми сумісності між двома платформами під час виконання. І багато частин цього було взято у Cygwin, тому що комусь уже довелося вирішити ті самі проблеми.

Отже, це не Cygwin, це DLL, що виконується MinGW, те, що тут поводиться дивно.

У Cygwin цей код насправді сильно змінився, оскільки в MSYS 1.0 - останнє повідомлення комісії для цього файлу написано "Імпортувати Cygwin 1.3.4", це з 2001 року!

І теперішній Cygwin, і нова версія MSYS - MSYS2 - вже мають іншу логіку, яка, сподіваємось, більш міцна. Це лише старі версії Git для Windows, які ще побудовані за допомогою старої зламаної системи MSYS.


Чисті розчини:

  • Встановіть Git для Windows 2 - він створений за допомогою нового, належним чином підтримуваного MSYS2, а також має багато нових функцій, багато виправлень помилок, покращення безпеки тощо. Якщо це взагалі можливо, також рекомендується використовувати 64-бітну версію . Але вирішення способу відновлення баз даних виконується автоматично за кадром для 32-бітних систем, тому шанси на виникнення проблеми повинні бути і нижчими.
  • Просто перезавантажте комп'ютер для очищення адресного простору (завантаження цих модулів за іншою випадковою адресою) може спрацювати, але насправді просто перейдіть на Git для Windows 2, щоб отримати виправлення безпеки, якщо нічого іншого.

Хейкі рішення:

  • Зміна PATHіноді може спрацювати, оскільки можуть бути різні версії msys-1.0.dllв різних версіях Git або інших додатків на основі MSYS, які, можливо, використовують різну адресу, різний розмір цієї купи тощо.
  • Випуск msys-1.0.dllможе бути марною витратою часу, оскільки 1) будучи DLL, у нього вже є інформація про переселення та 2) "у будь-якій версії ОС Windows немає гарантії, що (...) DLL завжди завантажуватиметься за тим самим адресним простором" все одно ( джерело ). Єдиний спосіб це може допомогти, якщо він msys-1.0.dllсам завантажується за конфліктуючою адресою, яку потім намагається використовувати. Мабуть, так буває і так, адже це те, що хлопці Git для Windows роблять автоматично в 32-бітних системах .
  • Враховуючи наведені вище висновки, я спочатку двійковим способом виправляв msys-1.0.dllбінарне, щоб використовувати інше значення, _cygheap_startі це негайно вирішило проблему.

1
Дякую за Ваш цікавий коментар! Виявляється, це було виправлено так чи інакше вже досить давно, і правильним рішенням, здається, є використання Git для Windows 2, побудованого на MSYS2 (і, отже, новіший код Cygwin).
Yirkha

2
Дякую, добре знати. Я використовую версію в комплекті з розширеннями git, що б там не було. Перезавантаження виправлена, тому я ігнорую її, поки оновлення не перетворить мене на шлях. :-)
Тім Абел

3
Ідеальна, добре задокументована відповідь! І правильне постійне вирішення проблеми замість прийнятої відповіді.
Søren Boisen

2
Ще трохи детальніше про проблему - github.com/git-for-windows/git/wiki/32-bit-isissue
Kunal

1
x64 Git для windows працював на мене і cmder. Дякую! Це зводило мене з розуму, особливо працюючи з cmder. Я в основному скопіював папку x64 Git в cmder/vendor/git-for-windowsкаталог і перейменував стару папку в git-for-windows-x86. Якщо ви відкриєте cmder/vendor/git-for-windows, ви побачите папку mingw32, яка є вашою підказкою, яку ви використовуєте 32-бітну. У x64 Git ви побачите папку mingw64.
cmeza

32

Дуже простий спосіб розв'язання бази даних:

Перейдіть у папку, де встановлено git, наприклад:

C:\Program Files (x86)\Git\bin

Утримуючи зрушення та клацнувши правою кнопкою миші в папці, ви зможете відкрити командний рядок як адміністратор звідти (спасибі https://stackoverflow.com/users/355389/darren-lewis за цей коментар),

Потім запустіть:

rebase.exe -b 0x50000000 msys-1.0.dll

Це вирішило для мене, коли підхід до перезапуску не працював.

Сподіваюся, це допомагає.


1
Працювали для мене. Просто переконайтеся, що ви запускаєте командний рядок як адміністратор.
Даррен Льюїс

Це також працювало для мене, як зауваження, я не знаю, як ви могли переключити клацання правою кнопкою миші та завантажити cmd.exe як адміністратор, тому я запустив cmd.exe клацніть правою кнопкою миші від start select start як адміністрування, а потім CD у каталог, потім запустіть команду. Це спрацювало!
edencorbin

13

Я побачив те саме повідомлення про помилку після оновлення до git1.8.5.2:

Просто зробіть пошук усіх msys-1.0.dllна своєму C:\приводі і зробіть той, який використовує Git.

Наприклад, у моєму випадку я просто змінив порядок:

C:\prgs\Gow\Gow-0.7.0\bin\msys-1.0.dll
C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\msys-1.0.dll

Зробивши шлях Git C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\першим на моєму %PATH%, повідомлення про помилку зникло.

Не потрібно перезавантажувати або навіть змінювати сеанс DOS.
Після %PATH%оновлення цього сеансу DOS команди git просто працюють.


Зауважте, що і Кармбрестер, і Сіксто Саез повідомляють нижче (у коментарях) про необхідність перезавантаження , щоб вирішити проблему.
Примітка. По-перше, також видалення будь-якого msys-1.0.dll, як-от одного в%LOCALAPPDATA%


1
У мене не було msys-1.0.dll більше ніде на моєму шляху, але схоже, що ви мали рацію на чомусь там - переміщення частини git мого шляху вище в списку вирішило проблему для мене. Дякую тобі за це! - так втомився від перезавантаження, щоб виправити.
кармбрестер

1
Мої "зайві" файли msys-1.0.DLL, де в C: \ Users \ ваш логін \ AppData \ Local з іншого додатка. Видалення програми та перезавантаження вирішили проблему для мене
Sixto Saez,

@SixtoSaez Цікаво. Я відредагував відповідь, щоб зробити крок перезавантаження більш помітним.
VonC

напевно, тим, хто також потребував перезавантаження, було потрібно саме це (інша проблема від неправильної завантаження DLL)
Джордж Бірбіліс

7

Якщо перезавантаження не усуває проблему (як це запропоновано у відповіді Грега Хегвілла), тоді перевірте свій PATH на наявність конфліктних установок msys-1.0.dll (та, можливо, інших пов'язаних DLL).

У моїй конкретній ситуації, встановлення MinGW msys має копію цієї DLL у своєму binкаталозі ( <MinGW_Install_Path>\msys\1.0\bin), і вона була зазначена у PATH. cmdКаталог Git був вказаний у PATH, але його binне було. (В каталозі знаходиться версія Git msys-1.0.dll bin. Мабуть, встановлення MSys-Git за замовчуванням не додає його binдо PATH.)

Тимчасовим виправленням було додати binкаталог Git до PATH, щоб він з'явився перед шляхами MinGW. (Більш постійне виправлення, ймовірно, передбачає впорядкування конфліктів шляху між msys MinGW та Git та / або видалення дублікатів msys.)


Перезавантаження мені це не виправили! На шляху дійсно було кілька дублюваних записів. Ткс багато.
Регінальдо Сантос

2

Просто хочу поділитися своїм досвідом тут. Я зіткнувся з тим же питанням під час перехресного компіляції для платформи MTK на машині Windows 64 біт. MinGW та MSYS беруть участь у процесі будівництва, і це питання спливе. Я вирішив це, змінивши msys-1.0.dllфайл. Ні rebase.exeмені, ні перезавантаження системи не працювало для мене.

Оскільки на моєму комп’ютері не встановлено rebase.exe. Я встановив cygwin64 і використовував rebase.exeвсередині:

C:\cygwin64\bin\rebase.exe -b 0x50000000 msys-1.0.dll

Незважаючи на те, що повторна публікація виглядала успішною, помилка залишилася. Потім я запустив rebaseкоманду всередині терміналу Cygwin64 і отримав помилку:

$ rebase -b 0x50000000 msys-1.0.dll
rebase: Invalid Baseaddress 0x50000000, must be > 0x200000000

Пізніше я спробував пару адрес, але жоден з них не працював. Тому я змінив msys-1.0.dllфайл, і це вирішило проблему.


1

Я сьогодні зіткнувся з цим. Керуючись відповіддю Грега Хьюгілла, я переглянув запущені процеси в моїй системі, щоб побачити, чи щось «застрягло» або чи інші користувачі ввійшли в машину, роблячи щось із git. Потім я запустив cygwin (встановлюється окремо) на цій конкретній машині. Це запустило нормально. Я закрив його, а потім знову спробував розширення Git (я намагався витягнути операцію), і воно спрацювало. Не впевнений, чи запуск cygwin очистив те, що було спільним, але я вперше зіткнувся з цією помилкою, і це, здавалося, виправило мене.


1

У мене була така ж проблема, після деякого збою та оновлення Windows 8.0, на msys git 1.9. Я не знайшов msys / git на своєму шляху, тому я просто додав його до налаштувань оточуючого середовища Windows. Він працював без перезавантаження.

По суті, подібний до RobertB, але у мене на шляху не було жодних git / msys.

Btw:

  1. Я спробував використовувати rebase -b blablabla msys.dll, але була помилка "ReBaseImage (msys-1.0.dll) не вдалося з останньою помилкою = 6"

  2. якщо вам це потрібно швидко і у вас немає часу налагодження, я помітив, що "Git Bash.vbs" в каталозі Git успішно запускає bash shell.


Та сама ситуація і для мене. Помилка публікації як адміністратора. Додано c:\Program Files (x86)\Git\binдо контуру і тепер я золотий.
Джон Кроуелл

1

Ця помилка трапляється дуже рідко на моїй машині Windows. Я закінчив перезавантаження машини, і помилка пішла.


0

Я зіткнувся з цією проблемою з LPCEXpresso building.if у вас є C: \ MinGW \ bin в PATH. чомусь мені довелося її зняти, щоб позбутися цієї проблеми, оскільки деякі інші MinGW, як і базовані




0

Видалення старої версії% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx працювало для мене. Не впевнений, як це було підключено до командного рядка git ...

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