Git та гидка "помилка: неможливо заблокувати існуючу інформацію / refs фатально"


360

Після клонування з віддаленого сховища git (у кращих кодах) я вніс деякі зміни, здійснив поступ і намагався натиснути:

git push origin master

Помилки з:

помилка: не вдається заблокувати існуючу інформацію / refs
фатально: git-http-push не вдалося

Ця справа стосується вже наявного сховища.

Що я робив раніше:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. змінити дані
  6. git commit

У "bettercodes" я не маю доступу до журналу git.

Я використовую Windows. Детальна помилка:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:password@git.bettercodes.org/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

Я клонував раніше, потім змінив код і здійснив.


Не пощастило, знову та сама помилка.
AnnD

Дві можливі причини: а) Запускається інший примірник git (вбити всі процеси git або перезавантажити) b) .git папка створена як адміністратор (спробуйте командний рядок адміністратора для операції)
FractalSpace

Для мене я вирішив помилку, зателефонувавши git fetchраніше git pull.
Леві Фуллер

1
Ця помилка противна
RobW

Відповіді:


682

Для мене це спрацювало:

git remote prune origin

Оскільки ця відповідь, здається, допомагає багатьом людям, я трохи розібрався у тому, що насправді відбувається тут. Для цього потрібно видалити посилання на віддалені гілки в папці .git/refs/remotes/origin. Таким чином, це не вплине на ваші локальні відділення, і це не змінить нічого віддаленого, але оновить локальні посилання, які ви маєте на віддалені гілки. Здається, у деяких випадках ці посилання можуть містити дані, які Git не може правильно обробити.


1
Я додав довідкову інформацію, але, чесно кажу, я не знаю точно, чому і як це працює :)
arno_v

1
git віддалене чорносливе походження працює для мене. Але я видалив усі посилання в .git / refs / remotes / origin.
Isuru Madusanka

2
Це саме те, що gitпропонує робити, але я неохоче робив це, тому що команда звучить так, ніби вона робить щось віддалене.
Викиньте рахунок

4
Я бігgit gc --prune=now
Стенлі Молала

9
Це НАЙКРАЩІЙ git cmd, який я запускав за деякий час. (PS: це спрацювало)
Sat Thiru

456

Ви хочете спробувати робити:

git gc --prune=now

Дивіться https://www.kernel.org/pub/software/scm/git/docs/git-gc.html


Чи --prune = тепер те саме, що --prune = все? Якщо це так, документація попереджає, що ви можете втратити незашифровані об’єкти. Якщо є незв’язані об’єкти, ви, ймовірно, спробуйте їх узгодити перед обрізкою.
Ассаф Ізраїль

3
Рятувальник життя, дякую. git pullбув застряг аналогічним повідомленням про помилку.
Філ Брубакер

4
Він допоміг для винятку "git error: не можна заблокувати ref". Дуже дякую!
Олександр

9
Це працювало для мене. Але тоді мені доводилося продовжувати виконувати одну і ту ж команду щоразу, коли я використовую gitкоманду, яка стосується віддаленого. git remote prune originвирішили це питання раз і назавжди.
Кейур Голані

врятував мій день! Велике спасибі :)
Абхішек Гаутам

188

Це сталося зі мною, коли мій пульт дистанційного керування (bitbucket.org) змінив їх IP-адресу. Швидке виправлення полягало у видаленні та повторному додаванні пульта, тоді все працювало як очікувалося. Якщо ви не знайомі з тим, як видалити та повторно додати пульт у git, ось такі дії:

  1. Скопіюйте URL-адресу git SSH наявного пульта. Ви можете роздрукувати його до терміналу за допомогою цієї команди:

    git remote -v

який надрукує щось подібне:

 origin git@server-address.org:account-name/repo-name.git (fetch)
 origin git@server-address.org:account-name/repo-name.git (push)
  1. Видаліть пульт із локального git repo:

    git remote rm origin

  2. Додайте пульт назад до місцевого репо:

    git remote add origin git@server-address.org:account-name/repo-name.git


8
Я спробував все інше, як, наприклад, git gc, git prune, rm "файл із помилкою блокування", інформація про сервер оновлення git тощо. Іноді це як перезавантаження Windows, перезавантаження, і це спрацює. Те саме тут, просто видаліть і додайте репо знову, і все піде нормально;)
Marquinho Peli

12
Після описаної вище процедури мені також потрібно було сказати git, щоб знову відстежувати віддалену гілку, наприклад:git branch -u origin/master
fotinsky

Це зняло всю мою інформацію про віддалене відстеження у .git / config та насправді не працювало.
ThomasMcLeod

Це працювало і для мене. Усі інші не працювали.
dondrzzy

42

Виконана команда git update-ref -d refs/heads/origin/branchвиправила його


4
Ця команда зробила трюк і для мене, хоча git update-ref -d refs/remotes/origin/my_branch
рефлекс

Це спрацювало для мене. Здається, це було проблемою чутливості до справ. Були дві гілки з однаковою назвою, які були підштовхнуті до походження іншим користувачем git.
th3uiguy

24

Я це виправив, зробивши наступне

git branch --unset-upstream
rm .git/refs/remotes/origin/{branch}
git gc --prune=now
git branch --set-upstream-to=origin/{branch} {branch}
#or git push --set-upstream origin {branch}
git pull

Це припускаючи, що локальні та віддалені відділення вирівняні, і ви просто отримуєте помилку refs як не фатальну.


12

У мене виникло це питання, оскільки я знаходився на гілці, яка мала схожу назву з гілкою вище. тобто була названа гілка вище за течією example-branchі моя місцева гілка example-branch/backend. Рішення було змінити назву моєї місцевої філії так:

git branch -m <new name goes here>

11

Це, мабуть, вирішено досі. Але ось що для мене спрацювало.

  1. Розташування:

    • Якщо заблокований сховище знаходиться на стороні сервера:

      1. ssh у ваше сховище git на сервері.
      2. Увійдіть як користувач, який має дозволи змінювати сховище та переходити до сховища на вашому сервері.
    • Якщо заблокований сховище є лише локальним:

      1. Відкрийте консоль git та перейдіть до каталогу сховищ.
      2. Виконайте цю команду:

        git update-server-info
        
  2. Виправте дозволи на ваше (віддалене або / та локальне) сховище, якщо потрібно. У моєму випадку я повинен chmodбув 777і chownдоapache:apache

  3. Спробуйте знову натиснути з локального сховища:

    git push
    

10

Що для мене працювало:

  1. Видалити .git/logs/refs/remotes/origin/branch
  2. Видалити .git/refs/remotes/origin/branch
  3. Біжи git gc --prune=now

1
Працював як шарм. Якщо хтось стикається з проблемою з гілкою імені файлу / папки, то він насправді має на увазі всі файли / папки імен гілок. Я сподіваюся, що це допомагає!
Анкіт Кешарвані

7

Ось як це працює для мене.

  1. шукайте файл блокування Apache DAV на вашому сервері (наприклад, / var / lock / apache2 / DAVlock)
  2. видаліть його
  3. відтворити його з дозволом на запис для веб-сервера
  4. перезапустити веб-сервер

Ще швидша альтернатива:

  1. шукайте файл блокування Apache DAV на вашому сервері (наприклад, / var / lock / apache2 / DAVlock)
  2. Очистіть файл: cat /dev/null > /var/lock/apache2/DAVlock
  3. перезапустити веб-сервер

Це було моє питання. Дякую за пост. Я запустив видалення та дозволи на всіх, за один знімок. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely

6

Це звучить як проблема з дозволом - чи можливо у вас було відкрито два вікна, виконані з окремими правами? Можливо, перевірте право власності на папку .git.

Можливо, перевірте, чи відкрито незабутнє блокування файлів, можливо, скористайтеся lsof, щоб перевірити, або еквівалент вашої ОС.


3

У моєму випадку гілка була переміщена до підкаталогу, а каталог називався гілкою. Гіт збентежився тим. Коли я видалив локальну гілку (у SourceTree лише правою кнопкою миші видалити), все працювало як завжди.


3

У моєму випадку після отримання цього повідомлення я зробив команду оформлення замовлення і мені було дано це повідомлення:

Your branch is based on 'origin/myBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Після виконання цієї команди я повернувся до нормального стану.


2

Оновлення:

Можливо, вам потрібно буде відредагувати файл ~ / .netrc:

https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553

Оригінальна відповідь:

Чому ви відключили ssl? Я думаю, що це може стосуватися вас, якщо ви не можете натиснути через https. Я б встановив її назад і спробував знову натиснути:

git config –global http.sslVerify true


1

У мене виникла ця проблема, коли я намагався створити нову гілку функції, яка містила назву старої гілки, наприклад, походження - branch1, і я хотів створити особливість branch1. Це не було можливо, але галузь1 / функція вже була.


1

У моєму випадку мені довелося вручну видалити старі теги, які були видалені на віддалений.


1

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

Щоб виправити проблему, я створив гілку з назвою, яка напевно не повинна існувати, як-от:

git checkout -b some_unknown_branch

Тоді я очистив усі інші мої гілки (не активні), бо вони були просто непотрібним сміттям.

git branch | grep -v \* | grep -v master | xargs git branch -D

а потім перейменував мою поточну галузь з іменем, яке я призначив, як-от:

git checkout -m my_desired_branch_name

0

У випадку bettercodes.org рішення є більш поетичним - єдина проблема може бути у правах, призначених учасникам проекту. Прості учасники не мають прав на запис! Переконайтеся, що у вас є права модератора чи адміністратора. Це, звичайно, потрібно встановити на bestcodes.org в налаштуваннях проекту адміністратором, звичайно.


0

Я побачив цю помилку при спробі запуску git filter-branchдля від'єднання багатьох підкаталогів до нового, окремого сховища (як у цій відповіді ).

Я спробував усі вищезазначені рішення, і жодне з них не вийшло. Врешті-решт я вирішив, що мені не потрібно зберігати свої теги все, що було погано в новій гілці, і просто запустив:

git remote remove origin
git tag | xargs git tag -d
git gc --prune=now
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA/ libs/xxx' --prune-empty -- --all
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.