git push:refs/heads/my/subbranch存在,无法创建

Sny*_*nyf 55 git

这是不可能在服务器上的repo中创建somme子子文件夹?

如果我做:

git push origin dev/master 
Run Code Online (Sandbox Code Playgroud)

一切工作找到

但如果我这样做

git push origin dev/sub/master
Run Code Online (Sandbox Code Playgroud)

我懂了:

error: 'refs/heads/dev/sub' exists; cannot create 'refs/heads/dev/sub/master'
Run Code Online (Sandbox Code Playgroud)

我用"git branch -r"检查并直接用ssh检查,没有创建dev/sub文件夹.

怎么了?

tor*_*rek 100

它不是一个存在的文件夹,它是一个分支.(好吧,可能有一个文件夹/目录涉及某处 - 或者可能没有,因为引用得到"打包"并停止作为目录中的文件存在.)

  • 如果b存在分支,b/anything则不能创建命名分支.
  • 同样,如果dev/b存在分支,dev/b/c则无法创建.

这是一个内部限制.在这种特殊情况下,remote origin有一个名为的分支dev/sub(无论你是否拥有它,重要的是远程是否拥有它).为了创造上origin,一个分支命名dev/sub/master,必须先删除命名的分支dev/suborigin:

git push origin :dev/sub
Run Code Online (Sandbox Code Playgroud)

(当然,删除这个分支可能会删除那里重要的东西,所以一定要知道你在做什么.一般来说,你可能想git fetch origin先把它们dev/sub当作你的origin/dev/sub.然后你可以创建一个名为dev/renamed-sub指向同一个提交的本地分支.,dev/renamed-sub在遥控器上创建,删除遥控器dev/sub,然后dev/sub/master在遥控器上创建.)


如果您可以登录远程(origin托管在其上的系统),则可以在那里进入存储库并简单地重命名本地dev/sub分支.(根据下面的评论,我怀疑那里也有一个破坏的自动部署脚本,可能应该修复只部署"可部署"分支,而不是被推送的所有内容.但我只是在这里猜测.)

  • 这是一个奇怪的令人恼火的限制,因为您可能希望将“release/1.1”和“release/1.2”与“release/1.1/hofix/prevent-upload-bork”和“release/1.1/hotfix/assure-user-of” -competence` 等。错误信息导致这里(谢谢),而不是说明限制!但谢谢你简单明了的解释。 (8认同)
  • "这是一个内部限制." - 好的,但为什么呢?有些逻辑更容易实现吗?还是一些树遍历?或者是什么? (2认同)
  • @D.Kovács:通过禁止这种情况,Git可以简单地将引用哈希值写入文件,其名称是通过将引用视为路径名来生成的.例如,如果Git允许`refs/tags/foo`和`refs/tags/foo/2`,它将无法执行此操作:它需要实现自己的键值存储.我认为Git无论如何都将被迫实施自己的键值存储,但我不知道他们是否会删除限制. (2认同)

mer*_*ius 43

我处于一种我甚至无法取得的状态,因为我的回购有关于我现在甚至没有检查过的不存在的远程分支的信息.我通过运行组合(感谢@torek)来解决它:

  • git branch -r 列出远程分支的本地副本
  • git ls-remote 列出远程分支
  • git fetch --prune origin更新远程分支的本地副本(这实际上没有帮助我)
  • git remote prune origin删除有关已删除的远程分支的信息(这样做)

  • `git remote prune origin` 是我为了解决此错误状态而运行的单个命令。确实存在误导性消息 - 在我的情况下,我试图推送“release/2.6.0”并且我已经删除了整个 'refs/remotes/origin/release*' 目录 - 但 git 一直在抱怨 `error: update_ref failed for ref ' refs/remotes/origin/release/2.6.0': 无法锁定 ref 'refs/remotes/origin/release/2.6.0': 'refs/remotes/origin/release' 存在;每当我尝试推/拉/获取时,都无法创建“refs/remotes/origin/release/2.6.0” (13认同)

小智 18

对我来说->

错误=

fatal: cannot lock ref 'refs/heads/release/wl/2.3': 'refs/heads/release/wl' 
exists; cannot create 'refs/heads/release/wl/2.3'
Run Code Online (Sandbox Code Playgroud)

解决方案=

$~ git update-ref -d refs/heads/release/wl
$~ git checkout release/wl/2.3
Run Code Online (Sandbox Code Playgroud)


awr*_*can 10

目前接受的答案没有帮助我,因为我没有在远程回购一个裁判删除-这纯粹是我的地方!所以,如果你处于这种情况,那么这是做什么的:

这是我面临的问题:

$ git fetch origin
error: cannot lock ref 'refs/remotes/origin/fix/sub-branch': 
'refs/remotes/origin/fix' exists; cannot create 
'refs/remotes/origin/fix/sub-branch'
From <repo URL>
 ! [new branch]      fix/sub-branch          -> origin/fix/sub-branch
 (unable to update local ref)
Run Code Online (Sandbox Code Playgroud)

我尝试了接受的答案的建议,但得到了这个:

$ git push origin :fix
error: unable to delete 'fix': remote ref does not exist
error: failed to push some refs to <repo URL>
Run Code Online (Sandbox Code Playgroud)

因此,裁判甚至不存在origin- 它显然只是悬挂在我当地的仓库的某个地方.所以我跑了$ git remote show me,产生了:

Remote branches:
...
refs/remotes/origin/fix             stale (use 'git remote prune' to remove)
...
Run Code Online (Sandbox Code Playgroud)

然后,解决方案明确:

$ git remote prune origin
Pruning origin
URL: <redacted>
 * [pruned] origin/fix
Run Code Online (Sandbox Code Playgroud)

有了这个,问题就消失了:

$ git fetch origin
remote: Counting objects: 5, done.
remote: Total 5 (delta 2), reused 2 (delta 2), pack-reused 3
Unpacking objects: 100% (5/5), done.
From <repo URL>
 * [new branch]      fix/sub-branch          -> origin/fix/sub-branch
Run Code Online (Sandbox Code Playgroud)

  • 是的,和你遇到的问题一样,`git remote prune origin`修复了它.谢谢! (2认同)

San*_*lke 6

我知道这已经得到回答,但它对我不起作用。我不关心局部变化,因为它已经被推高了,但在拉回时遇到了问题。就我而言,我们在将“修补程序”作为分支到将父文件夹作为“修补程序”的文件夹系统之间进行了中间更改。

-- 修补程序 ----修补程序/1234_bug ----修补程序/3456_bug

所以我收到以下错误:

Fetching from origin Error: cannot lock ref 'refs/remotes/origin/hotfix/1234_bug': 'refs/remotes/origin/hotfix' exists; cannot create 'refs/remotes/origin/hotfix'
Run Code Online (Sandbox Code Playgroud)

在搜索类似的错误后,我终于在此处的讨论线程中找到了解决方案。

git remote prune origin
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 5

尝试这个命令来修复它:

git gc
Run Code Online (Sandbox Code Playgroud)

在当前存储库中运行许多内务管理任务并删除无法访问的对象(通过调用git prunegit fsck --unreachable)。

阅读更多内容:(git help gc文档git help prune文档)。

git-gc - 清理不必要的文件并优化本地存储库

git-prune - 从对象数据库中删除所有无法访问的对象