使用capistrano在服务器上部署时,如何解决“无法锁定参考”错误?

时间:2019-02-07 21:23:25

标签: git capistrano

我试图将修补程序部署到我的登台服务器(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 :(得分:2)

虽然分支名称大多为 ,但hotfixhotfix/my-hotfix-branch-name只是显而易见的名称,即两个不同的名称,Git的一部分坚持使用(由于两个原因都很好和糟糕)将它们像目录和文件名组件一样对待。

(注意:如果您使用的是Windows,则可以在此处将/替换为\。或者,只需意识到a/b在Windows上的运行效果与{{1} },几乎用于所有用途。)

如果您有一个名为a\b文件,则您的操作系统将不允许您创建另一个名为README的文件。即,实体槽README/TOO被“文件实体”占用。您必须先删除或重命名README,然后创建一个名为README目录(或文件夹,如果您更喜欢该术语)。现在,您可以在此目录(或文件夹)中创建更多文件,或将原始README文件移动到该目录中。

Git对分支名称和远程跟踪名称施加完全相同的限制。如果存在一个名为README的分支,则不能创建一个名为hotfix的分支。您通过先删除hotfix/my-hotfix-branch-name您的存储库中解决了此问题。您必须在打算使用的所有其他Git存储库中执行相同的操作:(如果它具有hotfix,请将其删除。然后,您可以让其他Git存储库创建hotfix

看起来您的登台服务器中有一个hotfix/my-hotfix-branch-name分支。您可能必须直接登录到登台服务器,或者可以使用hotfix向其发送删除请求。无论哪种方式,您都必须获得 that Git才能删除该分支名称。在您自己的存储库上完成的操作无济于事,因为每个存储库都是独立的。

如果问题在本地存储库中发生,但是由于git push --delete之类的远程跟踪名称,运行origin/dir/filegit fetch -p origin应该可以解决问题。 git remote prune origin的{​​{1}}选项(可以拼写为-p)和fetch的{​​{1}}子命令都告诉您的Git删除 诸如--prune之类的远程跟踪名称之所以存在,是因为服务器具有一个名为prune的分支(此处强调过去时),但是从那时起,有人删除了该分支。您的远程跟踪名称是Git记住您上次与他们交谈时其分支机构的方式。因此,他们一个git remote分支,但它们不再有分支。现在他们有一个origin/dir分支。您必须先让Git删除dir,然后Git才能创建dir远程跟踪名称。

答案 1 :(得分:0)

我能够解决此问题:

  1. ssh到您的服务器。
  2. 找到/repo/文件夹(我在已部署的应用程序文件夹~/apps/app-name/repo中),然后找到cd
  3. 运行git remote prune origin

完成此步骤后,我便可以将其部署到服务器上。

答案 2 :(得分:0)

我做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