Git и противный «ошибка: не может заблокировать существующую информацию / ссылки роковые»

361

После клонирования из удаленного репозитория git (в лучших кодах) я внес некоторые изменения, зафиксировал и попытался нажать:

git push origin master

Ошибки с:

ошибка: не удается заблокировать существующую информацию / ссылки
фатальные: сбой 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

У 'bestcodes' у меня нет доступа к git log.

Я использую 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
источник
Не повезло, опять та же ошибка.
AnnD
Две возможные причины: а) запущен еще один экземпляр git (убить все процессы git или перезагрузить компьютер) б) папка .git была создана как администратор (попробуйте использовать командную строку администратора для этой операции)
FractalSpace
Для меня я решил ошибку, позвонив git fetchраньше git pull.
Леви Фуллер
1
Эта ошибка неприятна
RobW

Ответы:

688

Для меня это сработало:

git remote prune origin

Поскольку этот ответ, похоже, помогает многим людям, я немного углубился в то, что на самом деле происходит здесь. Для этого нужно удалить ссылки на удаленные ветви в папке .git/refs/remotes/origin. Так что это не повлияет на ваши локальные ветки и не изменит ничего удаленного, но обновит ваши локальные ссылки на удаленные ветки. Кажется, в некоторых случаях эти ссылки могут содержать данные, которые Git не может обработать правильно.

arno_v
источник
1
Я добавил некоторую справочную информацию, но я должен честно сказать, что не знаю точно, почему и как это работает :)
arno_v
1
git remote prune origin работают для меня. Но я удалил все ссылки в .git / refs / remotes / origin.
Исуру Мадусанка
2
Это именно то, что gitпредлагает делать, но я не хотел этого делать, потому что команда звучит так, будто она что-то делает с удаленным.
Сбросить счет
4
Я бегалgit gc --prune=now
Стэнли Мохлала
9
Это самый САМЫЙ СТРАШНЫЙ git cmd, который я запускал некоторое время. (PS: это сработало)
Sat Thiru
457

Вы хотите попробовать сделать:

git gc --prune=now

См. Https://www.kernel.org/pub/software/scm/git/docs/git-gc.html.

kiran.gilvaz
источник
Является ли --prune = сейчас таким же, как --prune = all? Если это так, документация предупреждает, что вы можете потерять незакрепленные объекты. Если есть незакрепленные объекты, вы, вероятно, должны попытаться примирить их перед обрезкой.
Ассаф Израиль
3
Спасатель жизни, спасибо. git pullзастрял с похожим сообщением об ошибке.
Фил Брубейкер
4
Это помогло для исключения «ошибка git: невозможно заблокировать ссылку» при получении. Большое спасибо!
Александр
9
Это сработало для меня. Но затем мне приходилось продолжать выполнять одну и ту же команду каждый раз, когда я использую gitкоманду, имеющую дело с удаленным. git remote prune originрешил вопрос раз и навсегда.
Кейур Голани
спас мой день! Большое спасибо :)
Абхишек Гаутам
188

Это случилось со мной, когда мой git remote (bitbucket.org) изменил свой IP-адрес. Быстрое решение проблемы заключалось в удалении и повторном добавлении пульта, после чего все работало как положено. Если вы не знакомы с тем, как удалить и повторно добавить пульт в git, выполните следующие действия:

  1. Скопируйте SSH git URL вашего существующего пульта. Вы можете распечатать его на терминал, используя эту команду:

    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:

    git remote rm origin

  2. Добавьте пульт обратно в локальный репозиторий:

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

johnnyclem
источник
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 как не фатальную.

FrankMonza
источник
12

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

git branch -m <new name goes here>
Джордж Армстронг
источник
12

Что сработало для меня:

  1. Удалить .git/logs/refs/remotes/origin/branch
  2. Удалить .git/refs/remotes/origin/branch
  3. Запустить git gc --prune=now
emirc
источник
1
Работал как шарм. Если кто-то сталкивается с проблемой с веткой имени файла / папки, то это фактически относится ко всем файлам / папкам с именем ветви. Надеюсь, это поможет!
Анкит Кешарвани
11

Возможно, это уже решено. Но вот что сработало для меня.

  1. Расположение:

    • Если заблокированный репозиторий находится на стороне сервера:

      1. ssh в ваш репозиторий git на сервере.
      2. Войдите в систему как пользователь, у которого есть разрешения на изменение хранилища и перейдите в хранилище на вашем сервере.
    • Если заблокированный репозиторий является локальным:

      1. Откройте консоль git и перейдите в каталог репозитория.
      2. Запустите эту команду:

        git update-server-info
        
  2. Исправьте разрешения для вашего (удаленного или локального) хранилища, если это необходимо. В моем случае я должен был chmodв 777и chownкapache:apache

  3. Попробуйте еще раз нажать из локального репозитория:

    git push
    
WolfTail
источник
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. перезапустите веб-сервер
schmunk
источник
Это была моя проблема. Спасибо за пост. Я запустил удаление и разрешения все в одном кадре. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely
6

Это похоже на проблему с разрешениями - возможно ли, что у вас было открыто два окна, выполняющихся с разными правами? Возможно, проверьте владение папкой .git.

Возможно, проверьте, есть ли открытая блокировка файла, возможно, используйте lsof для проверки или эквивалент для вашей ОС.

мистифицировать
источник
3

В моем случае ветвь была перемещена в подкаталог, и каталог был назван как ветвь. Git был смущен этим. Когда я удалял локальную ветку (в SourceTree просто щелчком правой кнопки мыши) все работало как обычно.

CodingYourLife
источник
3

В моем случае после получения этого сообщения я выполнил команду checkout и получил следующее сообщение:

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

После выполнения этой команды я вернулся к нормальной жизни.

Colin
источник
2

Обновить:

Вам может понадобиться отредактировать файл ~ / .netrc:

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

Оригинальный ответ:

Почему вы отключили ssl? Я думаю, что это может быть связано с тем, что вы не можете протолкнуть через https. Я бы поставил его обратно и попытался снова нажать:

git config –global http.sslVerify true
ralphtheninja
источник
1

Убедитесь, что у вас (на самом деле процесс git) есть доступ к файлу, .git/info/refsи этот файл не заблокирован другим процессом.

Иван Данилов
источник
2
Как вы это проверяете?
Юлиан Онофрей
1

У меня была эта проблема, когда я пытался создать новую ветвь функции, которая содержала имя старой ветви, например origin - branch1, и я хотел создать функцию branch1. Это было невозможно, но Branch1 / Feature уже была.

user11464384
источник
1

В моем случае мне пришлось вручную удалить старые теги, которые были удалены на удаленном компьютере.

joliejuly
источник
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 решение более поэтическое - единственная проблема может заключаться в правах, закрепленных за участниками проекта. Простые участники не имеют прав на запись! Пожалуйста, убедитесь, что у вас есть права модератора или администратора. Конечно, администратор должен установить это на bettercodes.org в настройках проекта.

yman
источник
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
tessafyi
источник
0

Вот что я сделал, чтобы избавиться от всех проблем с блокировкой ссылок:

git gc --prune=now
git remote prune origin

Это, вероятно, то, что вам нужно сделать тоже.

aliibrahim
источник