Не вдалося від’єднати файл


169

Я намагаюся зробити git pull, і я отримую таку помилку:

Від’єднання файлу 'lib / xxx.jar' не вдалося. Чи варто спробувати ще раз? (у / н)

Незалежно від того, я вибираю y чи n, неможливо дістатися до стану, коли я можу тягнути або натискати.


Ви перевірили, чи маєте ви право писати у цей файл?
Рафаель Мішель

1
запустіть право chmodта / або chownна вказаному файлі.
Not_a_Golfer

Я мав би мати права, інакше я його піддаю / chmod!
Марко


Відповіді:


204

Зазвичай це означає, що процес все ще використовує певний файл (на ньому все ще є ручка)
(у Windows ProcessExplorerдобре відстежувати такий процес)

Спробуйте закрити інші програми та повторіть спробу git pull.

Зауважте, що у вас є альтернатива зі GIT_ASK_YESNOзмінною .


Оновлення січня 2019 року:

Це повинно бути ще більш виправленим, Git 2.21 (Q1 2019), оскільки " git gc" і " git repack" не закрили відкриті файли пакунків, які вони виявили непотрібними перед їх видаленням, які не працювали на платформі, нездатній видалити відкритий файл.
Це було виправлено.

Див. Комітет 5bdece0 (15 грудня 2018 р.) Йоганнеса Шинделіна ( dscho) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті 5104f8f , 18 січня 2019 р.)

gc/ repack: при необхідності випускайте пакети

У Windows файли не можуть бути видалені або перейменовані, якщо процес все ще зберігається в ручках.
Щоб виправити це, ми ввели close_all_packs()функцію.

Раніше ми переконувались, що пакети випущені безпосередньо перед git gcпородженням, на випадок, якщо вони gcхочуть видалити вже не потрібні пакети.

Але цей розробник забув, що gcсам також повинен відпускати пакети, наприклад, при консолідації всіх пакетів за допомогою --aggressiveпараметра.

Так само git repack -dхоче видалити застарілі пакети, тому потрібно закрити і всі ручки упаковки.


Оновлення січня 2016 року

Це має бути зафіксовано в Git 2.8 (березень 2016 року) (і див. Git 2.19, Q3 2018 нижче)

Див. Комісію d562102 , фіксування dcacb1b , фіксування df617b5 , здійснення 0898c96 (13 січня 2016 р.) Йоганнеса Шинделіна ( dscho) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 3c80940 , 26 січня 2016 р.)

fetch: випустіть файли пакета перед збиранням сміття

Перед початком автоматичного gc'ing нам потрібно переконатися, що файли пакунків випущені у випадку, якщо їх потрібно буде перепакувати та зібрати сміття.

Багато кодових шляхів, які " gc --auto" запущені до виходу із збережених пакетних файлів, відображалися та залишали відкритими дескриптори файлів, що було непривітним для систем, які не можуть видалити відкриті файли.
Тепер вони закривають пачки, перш ніж це робити.

Це виправлення git-for-widowsвидає 500 .

Дивлячись на тест, який використовується для підтвердження нового підходу , можливим вирішенням (оскільки Git 2.8 ще не вийшов) було б підняти штучно gc.autoPackLimit.

git config gc.autoPackLimit 10000
git fetch
git config gc.autoPackLimit 50 # default value

git 2.8.4 (червень 2016 р.) згадує випуск 755, який також повинен полегшити проблему ( призначати 2db0641 ):

Переконайтеся, що дочірні процеси не успадковують тимчасові ручки файлів


Насправді, згаданий вище git-for-windowsвипуск 500 справді виправлений з Git 2.19, Q3 2018.
Див. " Git - від’єднання файлу .idxта .packпомилка (Єдина ручка, що належить процесу, до цього файлу git.exe) "


5
Швидше за все, існує JVM, що працює з цим jar-файлом.
Thorbjørn Ravn Andersen

2
У моєму випадку це був Skype. Раніше я передав файл іншим, а деякі ще не прийняли або скасували.
Вівек Кодіра

6
Винувателем виявився Windows Explorer. Це, швидше за все, через накладки піктограм TortoiseGit або TGitCache. Закриття всіх відкритих папок зробило трюк, але вам може знадобитися закрити папку проекту лише у випадку, якщо вона відкрита.
Аллан Бог,

4
У моєму випадку це був VS2013, оскільки він був прив’язаний до відкритого рішення.
BrotherOdin

2
Explorer.exe була моєю проблемою - у мене немає TortoiseGit. Я вбив explorer.exe з диспетчера завдань і породив новий за допомогою CTRL-ALT-DELETE => Диспетчер завдань => Файл => Запустити нове завдання => "
Explor.exe

57

Це специфічна відповідь для Windows, тому я знаю, що це не стосується вас ... Я просто включаю це на користь майбутніх шукачів.

У моєму випадку це було тому, що я запускав Git з непідвищеного командного рядка. "Запустити як адміністратор" виправив це для мене.


4
Я зіткнувся з цією проблемою в Windows 7, коли робив тягу і git зробив автопакет. Він скаржився на файли "idx". Потім я відкрив вікно консолі як адміністратор і запустив git gc, і проблем не було. Тож це хороше рішення.
grahamesd

1
git gc зробив це для мене в Windows 7. Це сталося, коли я робив тяг на git на cmder під час натискання на WebStorm
Alessandro

2
Ого. Спасибі NeilD. Це зафіксувало і для мене. Було б непогано перенести GIT до Windows трохи більше.
Мартін Добшик

Ну ... це було потрібно 6 років тому. Тепер? Хто знає? ¯_ (ツ) _ / ¯
NeilD

30

Для мене це було тому, що Visual Studio намагався перезавантажити всі змінені файли з витягування. Попросіть візуальну студію оновити, а потім запустіть git gc.


3
Подібні для мене. Затемнення потрібно було закрити перед запуском git gc.
alfoks

5

У Windows, що використовує GitHub для Windows, я отримав подібну помилку в оболонці при запуску git gc:

Unlink of file '.git/objects/pack/pack-0b40ae7eae9b83edac62e19c07ff7b4c175244f6.idx' failed. Should I try again? (y/n)

Я вирішив це, закривши графічний інтерфейс GitHub.


2

Спробуйте перезапустити Apache або інший веб-сервер, оскільки він, можливо, заблокував деякі ваші файли.


2

Закрили Visual Studio і Rubymine і більше не отримали помилку. Один з них був винуватцем.



1

У мене теж є ця проблема, але я виявив, що це саме UltraEdit, оскільки я використовував UE для організації та редагування робочої області затемнення ~~

Можливо, тому що UE має ручку на старій версії конкретного файлу, Git не зміг від’єднати його.

Після того, як я закрив UltraEdit, проблема більше не повторювалася.



0

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

Unlocker


0

У мене це траплялося в Windows XP, як повідомлення, застрягте в циклі, і його можна було усунути, відповівши.

Виникнення застряглої петлі було усунено закриттям Git-GUI. (Я запускав git merge -i в оболонці bash.)

Інші випадки траплялися, можливо, через велику кількість файлів у моєму сховищі. Це траплялося в основному з .cod файлами, які я згодом виключаю з контролю версій. (У мене є причина, щоб їх відстежувати.) Я вважаю, що причина може бути пов'язана зі швидкістю, з якою Git використовує файлові ручки.

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


0

У мене відкрився PHPStorm, це було закрито, і все було добре.


0

У мене був той самий випуск, і я закрив усі відповідні програми від Window Task Manager. Однак це все ще не працювало. Цікава частина полягає в тому, що я запустив "Git rebase" замість "Git pull", і це спрацювало!


0

Жоден з вищезазначених відповідей не працює для мене, але я запускаю команду git gc із силою, і це вирішило мій випадок.

'git gc --force'

[Windows 7, запустити як адміністратор => командний рядок]


0

Спробуйте запустити редактор командного рядка в адміністративному режимі та запустити команду. Це допомагає і вирішує проблему. :)


0

У моєму випадку у мене був старий метод обрізки тегів, що викликав проблему. Я вирішив це, знявши оригінал:

git config --global --unset remote.origin.fetch '\+refs/tags/\*:refs/tags/\*'

потім додайте це до обрізки видалених гілок на сервері:

git config --global fetch.pruneTags true

0

Я зіткнувся з тією ж помилкою і вирішив її, закривши затемнення і знову потягнувши, як файл використовувався.

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