我试图将修补程序部署到我的登台服务器(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
,但没有帮助。
我在这里一无所获
答案 0 :(得分:2)
虽然分支名称大多为 ,但hotfix
和hotfix/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/file
或git 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)
我能够解决此问题:
ssh
到您的服务器。/repo/
文件夹(我在已部署的应用程序文件夹~/apps/app-name/repo
中),然后找到cd
。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