Git и противный "ошибка: не может заблокировать существующую информацию / ссылки роковые" - PullRequest
236 голосов
/ 12 июля 2011

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

git push origin master

Ошибки с:

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

У «лучше кодов» у меня нет доступа к 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

Я клонировал раньше, затем изменил код и зафиксировал.

Ответы [ 16 ]

386 голосов
/ 06 апреля 2017

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

git remote prune origin

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

369 голосов
/ 08 июля 2016

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

git gc --prune=now

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

174 голосов
/ 28 марта 2016

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

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

    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

19 голосов
/ 08 ноября 2016

Я исправил это, выполнив следующее

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 как не фатальную.

18 голосов
/ 26 июля 2018

Выполнение команды git update-ref -d refs/heads/origin/branch исправлено.

10 голосов
/ 02 марта 2012

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

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

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

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

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

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

  3. Попытаться еще раз нажать из локального хранилища:

    git push
    
9 голосов
/ 14 февраля 2018

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

git branch -m <new name goes here>
6 голосов
/ 09 июля 2012

Вот как это работает для меня.

  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. перезагрузите веб-сервер
4 голосов
/ 12 июля 2011

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

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

2 голосов
/ 07 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...