git pull не вдається "не вдається вирішити посилання" "не вдається оновити локальний номер"


606

Використовуючи git 1.6.4.2, коли я спробував a, git pullя отримав цю помилку:

error: unable to resolve reference refs/remotes/origin/LT558-optimize-sql: No such file or directory
From git+ssh://remoteserver/~/misk5
 ! [new branch]      LT558-optimize-sql -> origin/LT558-optimize-sql  (unable to update local ref)
error: unable to resolve reference refs/remotes/origin/split-css: No such file or directory
 ! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

Я намагався git remote prune origin, але це не допомогло.


Відповіді:


929

Спробуйте очистити локальний сховище за допомогою:

$ git gc --prune=now
$ git remote prune origin

man git-gc (1):

git-gc - Cleanup unnecessary files and optimize the local repository

git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]

       Runs a number of housekeeping tasks within the current repository, such as compressing file revisions
       (to reduce disk space and increase performance) and removing unreachable objects which may have been
       created from prior invocations of git add.

       Users are encouraged to run this task on a regular basis within each repository to maintain good disk
       space utilization and good operating performance.

man git-remote (1):

git-remote - manage set of tracked repositories

git remote prune [-n | --dry-run] <name>

           Deletes all stale remote-tracking branches under <name>. These stale branches have already been
           removed from the remote repository referenced by <name>, but are still locally available in
           "remotes/<name>".            

96
Чому це працює? Яка проблема, яку вона виправляє?
Іке

5
Друга команда працювала на мене. Мабуть, у мене була зламана посилання на віддалену гілку, яка щойно створена. Не впевнений, як це сталося, але радий, що це було просте виправлення. Дякую Вітек!
JGTaylor

1
Це спрацювало чудово! Я також хотів би пояснити, що це робить і чому це спрацювало. Дякую!
ArielSD

4
Чи буде git remote prune originкоманда працювати в моїй робочій копії або на віддаленому сховищі?
користувач1438038

3
@ user1438038 Він не повинен видаляти жодних гілок, а лише оновлювати віддалені посилання у вашій місцевій робочій копії. Більш детальна інформація тут: stackoverflow.com/questions/20106712 / ...
Zengineer

606

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

rm .git/refs/remotes/origin/master
git fetch

Це змусило git відновити файл ref. Після цього все знову працювало так, як очікувалося.


1
Я робив те саме, і це вирішило мою проблему. Коли я відкрив файл у Блокноті ++, він виявився пошкодженим.
theMayer

83
переконайтеся, що ви вибрали файл, який створює проблеми замість майстра
bia.migueis

6
@ bia.migueis: якщо ви випадково видалите головний майстер, це нічого не пошкодить - воно також буде оновлено наступний збір.
naught101

2
Якщо це підмодуль, знайти проблему може бути трохи складніше. Спочатку перевірте, чи .gitє папка, виконуючи її, ls -laякщо ні, перегляньте вміст файлового .gitфайлу, щоб знайти справжню папку .git, у якій знаходяться відповідні документи. .gitвміст файлу в моєму випадку: gitdir: ../.git/modules/my-submodule-name
CCoder

1
Двічі зараз, за ​​минулий рік, я знову повернувся, щоб виправити це і знову, це єдине виправлення, яке насправді працює.
Тед

131

Це зробило роботу для мене:

git gc --prune=now

5
Це спрацювало. Дякуємо, що врятували мій день! @Bernd Можливе пояснення команди?
нашчез

git gc docs are here
BigRon

1
Працював і для мене. Не потрібно бігатиgit remote prune origin
Airwavezx

87

Для мене він працював над тим, щоб видалити файли, які викидають помилки з папки .git/refs/remotes/origin/.


що це зробили! Але просто з цікавості ви знаєте, чому виникла ця помилка? (все працювало нормально, а потім раптом одного разу ця помилка сплинула). А також чи знаєте ви, як видалення файлу вирішило його?
Шреянс

Приємно чути, що це також вирішило це для вас. Якщо чесно, я поняття не маю, що спричинило появу помилки. Думала, що один із файлів у папці вийшов із синхронізації. Оскільки жоден з інших виправлень, які я знайшов, працював для мене, я використовував це в крайньому випадку.
Брайан ван Руойєн

Працювали чудово! Зверніть увагу, що ви повинні видалити всі файли, що спричиняють проблему (на основі отриманого вами звіту про помилку), так як якщо ви видалите лише один і спробуєте витягнути його, він повернеться.
Rayee Roded

1
Однією з можливих причин може бути збій системи, як я описав у своїй відповіді . Багато додатків Git GUI періодично запускають Git на ваше репо (для оновлення статусу), і якщо ваша система під час збоїв під час роботи Git маніпулює посиланнями, вони можуть закінчитися переписати на NULLs.
Девід Ференці Рогожан

53

Спробуй це:

git gc --prune=now

git remote prune origin

git pull

26
Хоча це може відповісти на запитання авторів, у ньому відсутні деякі пояснювальні слова та / або посилання на документацію. Фрагменти сирого коду не дуже корисні без певних фраз. Ви також можете знайти, як написати гарну відповідь дуже корисно. Відредагуйте свою відповідь.
Рой Шефферс

Саме справа. Для правильного коду недостатньо, і все. Сподіваюся, є пояснення
Musikero31

1
git gc --prune = тепер оновлює локальний сховище, видаляючи зайві файли. Це чудово працює для мене.
Василь Гутник

44

Виконайте такі команди:

rm .git/refs/remotes/origin/master

git fetch

git branch --set-upstream-to=origin/master

На всякий випадок, якщо вам потрібно знати, що таке .git/refs/remotes/origin/master, ви прочитаєте розділ " Віддалені " в Git References .


1
Чи можете ви пояснити, що таке .git / refs / Remotes / origin / branchName? Це рішення спрацювало для мене
caitcoo0odes

44

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

Можлива першопричина

У моїй системі (Windows 7 64-розрядна), коли відбувається BSOD , деякі збережені файли посилань (найімовірніше, зараз відкриваються / записуються, коли сталося BSOD) перезаписуютьсяNULL символами (ASCII 0).

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

Приклад

Помилка: cannot lock ref 'refs/remotes/origin/some/branch': unable to resolve reference 'refs/remotes/origin/some/branch': reference broken

Рішення: видаліть файл%repo_root%/.git/refs/remotes/origin/some/branch


1
Той самий сценарій у Windows 10 64bit - робота в git repo, коли відбувається BSOD. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken. Спроба git pullпісля видалення першого повернутого файлу fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken. Після видалення другий файл git pull origin masterбув успішним.
cjmcdonn

39

У мене була ця сама проблема і вирішено її, перейшовши до файлу, на якому вона помилялася:

\repo\.git\refs\remotes\origin\master

У цьому файлі було багато нулів, я замінив його останньою версією від github.


2
Був такий самий випуск, але файл .git/refs/remotes/origin/masterбув просто порожнім. Вирішили проблему, видаливши її.
zinovyev

38

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

Якщо ви подивитесь на повідомлення, воно покаже вам, які файли потрібно видалити (конкретно).

Файли для видалення сидять під .git/refs/remotes .

Я щойно видалив усі файли там і запустив gc prune

git gc --prune=now

Після цього все працює просто чудово.


У моєму випадку я просто видаляю .git / refs / remotes, а потім оновлюю і пересуваю сервер, і він працював.
Фараз Ахмед

Спасибі Урі. У моєму випадку я просто видалив файли під refs / remotes / origin / функцією, і я просто зробив - git pull
Deepboy

26

Пояснення : Схоже, ваші віддалені гілки репо (в Github / bitbucket) були видалені, хоча ваші локальні посилання не оновлювались і вказували на неіснуючі посилання.

Для вирішення цього питання:

git fetch --prune
git fetch --all
git pull

Для додаткового читання - Довідка з документації Github :

git-fetch - Завантажуйте об'єкти та реф-файли з іншого сховища

- всі Вилучати всі віддалені.

--prune Після отримання, видаліть всі віддалені гілки відстеження, яких більше немає на віддаленому.


1
Це спрацювало для мене
Оненгейе Річард

1
Дякую, це працювало на мене.
Сем

17

git fetch --prune виправили цю помилку для мене:

[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:25]
[I]> git fetch
error: cannot lock ref 'refs/remotes/origin/user/janek/integration/20170505': 'refs/remotes/origin/user/janek/integration' exists; cannot create 'refs/remotes/origin/user/janek/integration/20170505'
From github.com:zooxco/driving
 ! [new branch]            user/janek/integration/20170505 -> origin/user/janek/integration/20170505  (unable to update local ref)
From github.com:zooxco/driving
[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:30]
[I]> git fetch --prune
 - [deleted]               (none)     -> origin/user/janek/integration

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


Ваш приклад здається неповним: він не показує того, --pruneщо я бачу. Також підказка: видаліть непотрібні підказки пароля після вставки прикладів.
MarkHu

Ви абсолютно праві - я припинив вихід із команди "Вибір", але я просто поставив її в приклад. Дякуємо за пораду щодо видалення запиту про введення пароля!
marczych

11

Якщо ця помилка "не в змозі оновити місцевий номер" повторюється, навіть після застосування відповіді Войтеха Вітека або Мішеля Кремера , можливо, у вас може виникнути погана інформація про ваш локальний І головний сховище.

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

rm .git/refs/remotes/origin/master
git fetch
git gc --prune=now
git remote prune origin

Постійне дозвіл для мене було досягнуте лише після застосування обох виправлень перед натисканням / потягуванням.


1
Дякую за це зауважте, що я замінив "master" гілкою, яка вийшла з ладу, наприклад - rm .git / refs / Remotes / origin / development
Дамієн Сойєр

1
Дякую за вашу відповідь, дуже допомогла!
naffiq

1
Це працювало для мене
by Jeevan

10

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

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

Для вирішення подібних питань виконайте тягнення або витягніть з дистанційного.

git remote prune origin

або якщо ви використовуєте будь-який графічний інтерфейс, виконайте вилучення з віддаленого.

введіть тут опис зображення



3

Спробуйте це:

git pull origin Branch_Name

Branch_Name, галузь, на якій ви зараз перебуваєте.

Якщо ви робите лише a git pull , це також витягує всі інші створені назви гілки.

Ось чому ви отримуєте це:

! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

2

Для мене було місцеве відділення з назвою, feature/phase2а віддалене відділення було названо feature/phase2/data-model. Конфлікт іменування був причиною проблеми, тому я видалив свою локальну гілку (ви можете перейменувати її, якщо в ній було все, що потрібно зберегти)


Те ж питання тут - наш теж був Mac / PC випадок іменування питання, який зробив його складно виявити (одна назва капіталізуються, іншої немає - і він працював на комп'ютері, але не Mac)
рокстеді

2

Якщо git gc --prune=nowвам не допоможуть. (невдача, як я)

Що я зробив, це видалити проект у локальному масштабі та знову клонувати весь проект.


Це "Я отримав повідомлення про помилку, тому я купив новий комп'ютер" - підхід, який я не очікував отримати оновлення на цьому веб-сайті.
Стефан Віеркант

2

Я використовую Tower і чомусь назва моєї папки була .git/refs/remotes/origin/Github. Змінивши його на малі регістри, .git/refs/remotes/origin/githubвирішив проблему.


1

У мене був такий самий випуск. я виконую наступні кроки

1) переключити свою філію, яка має випуск, на іншу

2) видалити цю гілку

3) замовлення знову.

Примітка: - Ви можете приховати непомічені зміни та повернути їх знову.



0

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

rm -rf vendor/*
git gc --prune=now
git pull
composer clear-cache
composer update my/package

0

Отримав цю проблему при спробі клонування зі git bundleствореного файлу, жоден з інших відповідей не спрацював, тому що я не міг клонувати репо (тому про git gcвидалення / редагування файлів не виникало сумнівів).

Однак був ще один спосіб виправити це - вихідний файл .bundleфайлу починався з:

# v2 git bundle
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d HEAD
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master

PACK.......p..x...Kj.0...: (and so on...)

Просто видалення четвертого рядка за допомогою vim виправило проблему.


0

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

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


0
 # remove the reference file of the branch "lost"
 rm -fv ./.git/refs/remotes/origin/feature/v1.6.9-api-token-bot-reader

 # get all the branches from the master
 git fetch --all

 # git will "know" how-to handle the issue from now on
 #     From github.com:futurice/senzoit-www-server
 # * [new branch]      feature/v1.6.9-api-token-bot-reader ->
 # origin/feature/v1.6.9-api-token-bot-reader

 # and push your local changes
 git push

0

Зіткнулися з тією ж проблемою, коли сховище було видалено та створено з тим самим іменем. Він працював лише тоді, коли я перевстановив віддалений URL, як показано нижче;

git віддалене походження URL-адреси набору [GIT_REPO_URL]

Перевірте віддалений URL:

git remote -v

Тепер усі команди повинні працювати як завжди.


0

Щойно натрапив на проблему сьогодні.

Спосіб усунення несправностей. За допомогою SourceTree на серверах Windows ви можете спробувати запустити його як адміністратор. Це вирішує мою проблему "не в змозі оновити локальну посилання" на Atlassian Source Tree 2.1.2.5 на Windows Server 2012 R2 у домені.

Якщо ви можете занадто повторити цю ситуацію, це доводить, що проблема викликана видачею дозволу. Краще ознайомитись і знайти першопричину - можливо, деякі конкретні файли належать іншим користувачам і такі - інакше є небажаний побічний ефект: вам доведеться запускати SourceTree як адміністратор на всю вічність.


Ну, я б не рекомендував цього. У вас з’явиться ще більше файлів з неправильними дозволами. І вам потрібно буде запустити все, що маніпулює файлами репозиторію як адміністратор. Чи не краще в першу чергу просто виправити дозволи?
Девід Ференчі Рогожан

Ти правий. Але тільки після того, як він працював як адміністратор, я зрозумів, що це питання дозволу. Тож це був крок у моїй процедурі діагностики, а не ідеальне рішення як таке.
Ліонет Чен

Звичайно. Але багато користувачів можуть просто сприймати вашу відповідь як рішення, не знаючи насправді наслідків. Можливо, краще, якщо ви додасте виправлення дозволів у якості запропонованого рішення.
Девід Ференчі Рогожан

0

Списання конкретного випадку, який може спричинити цю проблему.

Одного разу я висунув гілку з назвою "особливість / підфункція", одночасно маючи гілку "особливість".

Ця операція спрацювала нормально без будь-якої помилки з моєї сторони, але коли мої співробітники дістали та / або витягнули будь-яку гілку, всі вони мали точно таке ж повідомлення про помилку unable to update local ref,cannot lock ref 'refs/remotes/origin/feature/subfeature .

Це було вирішено шляхом видалення featureвідділення на віддаленому ( git push --delete origin feature), а потім запуску git remote prune originна репо моїх колег, які генерували повідомлення в тому числі* [pruned] origin/feature .

Отже, я здогадуюсь, git fetchнамагався створити subfeatureref у featureпапці на git внутрішньо (.git / ...), але створити папку не вдалося, оскільки там featureвже була ref.


0

Цю проблему ми отримали, коли розробник на Mac створив гілку із символом, що перевищує ">" у назві гілки.

Це спричинило проблеми в TeamCity та на локальних комп'ютерах під керуванням Windows під управлінням SourceTree. BitBucket випускає це без проблем.

Щоб вирішити, користувач видалив гілку та відтворив її. Що було приємно і легко.


-1

Був той самий msg, але з каталогом, під час виходу з ладу не вдалося.

git -prone мені теж не допоміг. Виявляється, був файл з тим самим іменем, що і каталог, створений віддалено.

Довелося перейти до .git \ logs \ refs \ remotes \ origin та стерти файл локалу - тоді знову потягніть, все добре.

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