Как исправить ошибку «не удается заблокировать ссылку» при развертывании на сервере с использованием capistrano? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытался развернуть исправление на своем промежуточном сервере (DigitalOcean), но получил ошибку «не могу заблокировать ссылку».Я наткнулся на эту ошибку раньше.У меня была ветка 'hotfix', а затем я создал ветку 'hotfix / some-hotfix', и когда я попытался выдвинуть ее в начало, я получил ошибку.Я исправил это, удалив ветку «исправление» в моем хранилище (BitBucket).Но теперь я получаю его при развертывании на промежуточном сервере.

Трассировка стека:

SSHKit::Command::Failed: git exit status: 1
git stdout: Fetching origin
error: cannot lock ref 'refs/heads/hotfix/my-hotfix-branch-name': 'refs/heads/hotfix' exists; cannot create 'refs/heads/hotfix/my-hotfix-branch-name'
From bitbucket.org:username/repo-name
! [new branch] hotfix/my-hotfix-branch-name -> hotfix/my-hotfix-branch-name (unable to update local ref)
error: some local refs could not be updated; try running
'git remote prune origin' to remove any old, conflicting branches
error: Could not fetch origin
git stderr: Nothing written

Я попытался запустить git remote prune origin, но это не помогло.Я застрял здесь без идей

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Я смог решить эту проблему, выполнив следующие действия:

  1. ssh на ваш сервер.
  2. Найти папку /repo/ (я получил мою в папке развернутого приложения ~/apps/app-name/repo) и cd в него.
  3. Выполнить git remote prune origin.

После выполнения этих шагов я смог развернуться на моем сервере.

0 голосов
/ 19 февраля 2019

У меня была похожая проблема, когда я делал git pulll

> $ git pull 
> error: cannot lock ref
> 'refs/remotes/origin/release/thing_15': 'refs/remotes/origin/release'
> exists; cannot create 'refs/remotes/origin/release/thing_15' From
> https://git.mycompany.com/projects/myproject

Git fetch исправил это с опцией -p (которая существует в более новых версиях git), пожалуйста, посмотрите документ здесь https://git -scm.com / docs / fetch-options / 2.20.0 # fetch-options - p

git fetch -p
0 голосов
/ 08 февраля 2019

В то время как имена веток в основном просто строки, поэтому hotfix и hotfix/my-hotfix-branch-name являются просто очевидными, то есть два разных имени - части Git настаивают (по причинам как хорошим, так и плохим) при леченииони похожи на компоненты каталогов и имен файлов.

(Примечание: если вы работаете в Windows, вы можете мысленно заменить / на \ здесь. Или просто поймите, что a/b работает так же хорошо в Windowsкак a\b, для почти всех целей.)

Если у вас есть файл с именем README, ваша ОС не позволит вам создать другой файл с именем README/TOO.То есть слот сущности README занят "сущностью файла".Сначала вы должны удалить или переименовать README, затем создать каталог (или папку, если вы предпочитаете этот термин) с именем README.Внутри этого каталога (или папки) вы теперь можете создавать больше файлов или перемещать исходный файл README в этот каталог.

Git накладывает точно такие же ограничения на имена веток и надистанционное отслеживание имен.Если существует ветвь с именем hotfix, вы не можете создать ветку с именем hotfix/my-hotfix-branch-name.Вы исправили это в вашем хранилище, сначала удалив hotfix.Вы должны сделать то же самое в во всех остальных репозиториях Git, которые вы намереваетесь использовать: , если у него есть hotfix, удалите его.Затем вы можете создать этот другой Git-репозиторий hotfix/my-hotfix-branch-name.

Похоже, ваш промежуточный сервер содержит ветку hotfix.Возможно, вам придется войти на свой промежуточный сервер напрямую, или вы можете использовать git push --delete для отправки ему запроса на удаление.В любом случае, вы должны получить , что Git, чтобы удалить имя этой ветви.Операции, выполняемые в вашем собственном репозитории, не помогают, потому что каждый репозиторий является независимым.

Когда проблема возникает в локальном репозитории, но из-за имен удаленного отслеживания, таких как origin/dir/file, запуск git fetch -p origin или git remote prune origin должен решить проблему.И параметр -p для fetch - который можно записать --prune - и подкоманда prune для git remote говорят вашему Git удалить имена для удаленного слежения, такие как origin/dirЭто существовало потому, что на сервере была (с акцентом на прошедшее время) ветвь с именем dir, но с тех пор кто-то удалил эту ветвь.Ваши имена для удаленного отслеживания - это способ, которым ваш Git запоминает, какими были их ветви в последний раз, когда вы с ними разговаривали.Таким образом, у них была dir ветвь, но у них больше нет ее;теперь у них есть ветка dir/file.Ваш Git должен удалить ваш origin/dir, прежде чем ваш Git сможет создать origin/dir/file имя для удаленного отслеживания.

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