首页 > 解决方案 > 使用 capistrano 在服务器上部署时如何解决“无法锁定 ref”错误?

问题描述

我试图将修补程序部署到我的登台服务器(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,但没有帮助。我在这里没有想法

标签: gitcapistrano

解决方案


虽然分支名称大多只是字符串——所以hotfix并且hotfix/my-hotfix-branch-name只是显而易见的,即两个不同的名称——Git 的一部分坚持(出于好的和坏的原因)将它们视为目录和文件名组件。

(注意:如果你在 Windows 上,你可以在心里/\here 代替。或者,只要意识到它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分支。您可能必须直接登录到您的登台服务器,或者您可以使用 agit push --delete向其发送删除请求。无论哪种方式,您都必须让Git 删除该分支名称。在您自己的存储库上完成的操作没有帮助,因为每个存储库都是独立的。

当问题发生在本地存储库中时,但由于远程跟踪名称,例如origin/dir/file,运行git fetch -p origingit remote prune origin应该解决问题。选项——-p可以fetch拼写--prune—— 和prune子命令git remote告诉你的 Git删除远程跟踪名称,例如origin/dir,因为服务器有(这里强调过去时)一个名为 的分支dir,但从那时起,有人删除了那个分支。您的远程跟踪名称是您的 Git 记住您上次与他们交谈时他们的分支是什么的方式。所以他们一个dir分支,但他们不再有一个;现在他们有一个dir/file分支。你必须让你的 Git 删除你的origin/dir在您的 Git 可以创建origin/dir/file远程跟踪名称之前。


推荐阅读