Git 无法删除名为 release 的分支,并阻止创建以 release/ 为前缀的分支

Git branch named release cannot be deleted and prevents creating branches prefixed with release/

我无法创建以发布为前缀的分支:

$ git checkout master && git pull
$ git checkout -b release/0.7.6
$ git push --set-upstream origin release/0.7.6
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: 
remote: Create pull request for release/0.7.6:
remote:   https://bitbucket.org/xxx/xxx/pull-requests/new?source=release/0.7.6&t=1
remote: 
To bitbucket.org:xxx/xxx.git
 * [new branch]      release/0.7.6 -> release/0.7.6
Branch 'release/0.7.6' set up to track remote branch 'release/0.7.6' from 'origin'.
error: update_ref failed for ref 'refs/remotes/origin/release/0.7.6': cannot lock ref 'refs/remotes/origin/release/0.7.6': 'refs/remotes/origin/release' exists; cannot create 'refs/remotes/origin/release/0.7.6'

当我查看 bitbucket 界面时,我可以看到那里的分支 release/0.7.6,0 之前提交,0 之前提交 master。

写入 git fetch 会产生额外的错误:

$ git fetch
error: cannot lock ref 'refs/remotes/origin/release/0.7.6': 'refs/remotes/origin/release' exists; cannot create 'refs/remotes/origin/release/0.7.6'
From bitbucket.org:xxx/xxx
 ! [new branch]      release/0.7.6 -> origin/release/0.7.6  (unable to update local ref)

当我写 git checkout 并使用制表符完成时,我确实得到了 release 可以检查的建议,但是当我尝试这样做时它又失败了:

$ git checkout release
fatal: cannot lock ref 'refs/heads/release': 'refs/heads/release/0.7.6' exists; cannot create 'refs/heads/release

我看到有一个叫release的东西,它是红色的,但是我不能删除它:

$ git branch -a | grep remotes/origin/release
  remotes/origin/release
$ git branch -D origin/release
error: branch 'origin/release' not found.
$ git branch -D release
error: branch 'release' not found.
$ git branch -D remotes/origin/release
error: branch 'remotes/origin/release' not found.

如果我先删除我创建的release/0.7.6

可以查看
$ git checkout release
Branch 'release' set up to track remote branch 'release' from 'origin'.
Switched to a new branch 'release'

我做了什么,我该如何解决?

更新 我们的 bitbucket 分支模型是传统的 git 流:

分支权限已经保护历史和写在master上,只允许与PR合并。

我找不到任何会导致这种情况的设置。

TLDR;具有模式 A/B 的分支作为名为 B 的文件存在于名为 A 的文件夹中。如果您已经有另一个名为 A 的分支,您将收到类似于您所看到的错误。

error: update_ref failed for ref 'refs/remotes/origin/release/0.7.6': cannot lock ref 'refs/remotes/origin/release/0.7.6': 'refs/remotes/origin/release' exists; cannot create 'refs/remotes/origin/release/0.7.6'

错误告诉您一个名为 release 的分支已经存在于您的 BitBucket 存储库中。在引擎盖下,它存储在 .git/refs/remotes/origin/release 中的文件中。现在您正在尝试推送一个名为 release/0.7.6 的分支,它将在 .git/refs/remotes/origin/release/0.7.6 中创建一个文件。由于文件 release 已经存在,git 无法创建名为 release 的文件夹来存储 0.7.6 文件。

要解决此问题,请先仔细检查您是否可以删除 release 分支。如果您确定这是安全的,那么您可以使用 git push origin :release.

删除它