Печально известный Git Ошибка: удаленный отказ (не удалось заблокировать)
Я пытаюсь нажать на ветку от моего локального к происхождению. Имя ветки и путь те же. Я толкал и вытягивал из этой ветки какое-то время, и у меня не было проблем. Но внезапно это начало плохо себя вести. В прошлый раз, когда я попытался нажать на начало координат с помощью следующей команды:
git push origin feature/Prizefulfilment
Это дает мне следующее сообщение об ошибке:
72c6c1da98e5cff4484e254a538d9e3b472156ff but expected 0000000000000000000000000000000000000000
У меня Googled, но пока не нашел вполне удовлетворительного решения.
Моя точная ошибка выглядит следующим образом:
$ git push origin feature/Prizefulfilment
Counting objects: 126, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (75/75), done.
Writing objects: 100% (78/78), 8.83 KiB, done.
Total 78 (delta 61), reused 0 (delta 0)
error: Ref refs/heads/feature/Prizefulfilment is at 72c6c1da98e5cff4484e254a538d9e3b472156ff but expected 0000000000000000000000000000000000000000
remote: error: failed to lock refs/heads/feature/Prizefulfilment
To [email protected]:OpusOneSCRUM
! [remote rejected] feature/Prizefulfilment -> feature/Prizefulfilment (failed to lock)
error: failed to push some refs to '[email protected]:OpusOneSCRUM'`
Любые идеи?
Ответы
Ответ 1
git push feature/prizeFulfilment: feature/Prizefulfilment
Это похоже на этот ответ:
Для записи я считаю, что основной причиной этой проблемы была разница в капитализации между локальными и удаленными именами ветвей и нечувствительность к регистру общего ресурса Windows, размещавшего удаленный репозиторий.
Мы только что столкнулись с такой же ошибкой и смогли решить проблему, просто переименовав локальную ветвь в соответствии с капитализацией существующей удаленной ветки.
Попробуйте выполнить использование одной и той же заглавной буквы между локальными и удаленными ветвями.
Вторая команда делает ссылку между prizeFulfilment
и удаленным prizeFulfilment
явным, поэтому она и работала. Но это нехорошее решение сохранить локальную ветвь с такой разницей.
Ответ 2
Другая возможная причина проблем, присутствующих и в чувствительных к регистру системах, - это конфликтующие нарушения имен.
Если удаленный репозиторий содержит ветвь a/b
, и вы пытаетесь нажать ветвь a/b/c
, то об ошибке будет сообщено git (определенно это описание ошибки должно быть улучшено).
https://coderwall.com/p/qkofma/a-caution-about-git-branch-names-with-s
https://ocroquette.wordpress.com/2011/07/10/git-failed-to-lock/
Ответ 3
Что со мной произошло, так это то, что git менял капитализацию моей локальной ветки. У меня был старый филиал с именем Feature/blahBlah и новая ветвь с именем feature/fooBar. Последний был автоматически переименован в Feature/fooBar, так как git хранит ветки в виде папок, и у меня не может быть одинакового имени папки с различной капитализацией.
Чтобы исправить это, мне пришлось перейти в .git/refs/heads и переименовать "Feature" в "feature" , чтобы все ветки были согласованы.
Ответ 4
Я видел эту ошибку, потому что предыдущая ветвь существовала с тем же именем, что и мое новое имя пути ветки. Пример:
- Удаленная ветвь:
some_feature
- Локальный имеет ветку:
some_feature/some_subfeature
- Локальный переносит ветвь
some_feature/some_subfeature
на удаленный
- Удаленная ошибка:
(failed to lock)
Решения:
- Переименуйте локальную ветвь
some_feature/some_subfeature
в foo/some_subfeature
- Удалить удаленную ветвь
some_feature
Ответ 5
В моем случае это были неправильно установленные разрешения в репозитории git. Я нашел решение здесь: Как правильно использовать права доступа к групповым файлам в репозитории git?
Проблема заключалась в том, что при создании новой ветки, содержащей путь (feature/Prizefulfilment), папка "feature" создается в "refs/heads", и новая папка наследовала идентификатор группы пользователей, что не позволяло будущим пользователям использовать тот же путь
Чтобы решить эту проблему, вы должны установить setgid для всех каталогов в git-репозитории, чтобы новая папка наследовала свой идентификатор группы, а не идентификатор группы пользователя.
chown -R git:git /path/to/repo
chmod -R g+rw /path/to/repo
find /path/to/repo -type d -print0 | xargs -0 chmod g+s
Ответ 6
В моем случае у меня была проверка ветки со всеми строчными буквами. Это вызвало несогласованность между именами удаленной ветки и локальной ветвью.
Удаленная ветвь была INT-4368-some-feature-details, тогда как локальная ветвь была int-4368-some-feature-details.
Чтобы исправить это, я вошел в .git\refs\heads\feature и переименовал имя ветки в соответствии с удаленным. Затем перешел в командную строку и запустил
git checkout INT-4368-some-feature-details
Ответ 7
Когда вы получите такое сообщение, сначала выполните операцию pull из удаленной ветки. Затем выполните операцию push.When кто-то толкает файлы на удаленный сервер, он сдвигает главную ветвь (в случае, если удаленная ветка является ведущей, это может быть любое имя ) в какое-то другое место. Вам нужно обновить это в локальном репозитории, так что начало/мастер в локальном репозитории будет двигаться вперед. Затем добавьте файлы в локальный репозиторий и зафиксируйте его. Затем нажмите кнопку "Операция". Он работал у меня
Ответ 8
Имя ветки локального и удаленного репо не совпадает с точки зрения использования заглавных букв, вы можете переименовать ваше локальное отделение с помощью этой команды: -
git branch -m new-name