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

问题描述 投票:43回答:9

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

如果我做:

git push origin dev/master 

一切工作找到

但如果我这样做

git push origin dev/sub/master

我懂了:

error: 'refs/heads/dev/sub' exists; cannot create 'refs/heads/dev/sub/master'

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

怎么了?

git
9个回答
86
投票

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

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

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

git push origin :dev/sub

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


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


39
投票

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

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

11
投票

对我来说 - >

错误=

fatal: cannot lock ref 'refs/heads/release/wl/2.3': 'refs/heads/release/wl' 
exists; cannot create 'refs/heads/release/wl/2.3'

解决方案=

$~ git update-ref -d refs/heads/release/wl
$~ git checkout release/wl/2.3

9
投票

currently accepted answer没有帮助我,因为我没有删除远程仓库的参考 - 这纯粹是在我当地的!所以,如果你处于这种情况,那么这是做什么的:

这是我面临的问题:

$ 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)

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

$ git push origin :fix
error: unable to delete 'fix': remote ref does not exist
error: failed to push some refs to <repo URL>

因此,参考文献甚至不存在于origin上 - 它显然只是悬挂在我当地回购的某个地方。所以我跑了$ git remote show me,它产生了:

Remote branches:
...
refs/remotes/origin/fix             stale (use 'git remote prune' to remove)
...

然后,解决方案明确:

$ git remote prune origin
Pruning origin
URL: <redacted>
 * [pruned] origin/fix

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

$ 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

2
投票

尝试使用此命令来修复它:

git gc

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

阅读更多:git help gcgit help prune


0
投票
#!/usr/bin/env bash
echo "update-ref delete refs/tags"
log="git-update-ref-errors.log"
script="./git-update-ref-exist-tags-delete.sh"
git_command="git update-ref -d refs/tags"

echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors to ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}

echo fetch
log="git-fetch-errors.log"
script="./git-fetch-exist-tags-delete.sh"
git_command="git fetch"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git fetch

echo pull
log="git-pull-errors.log"
script="./git-pull-exist-tags-delete.sh"
git_command="git pull"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git pull

echo push
log="git-push-errors.log"
script="./git-push-exist-tags-delete.sh"
git_command="git push"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git push

上面的脚本会将错误记录到XXX-errors.log并通过使用以下命令从XXX-errors.log自动生成并运行XXX-exist-tags-delete.sh来修复它们:

  1. git update-ref -d refs / tags
  2. git fetch
  3. 去拉
  4. git push

0
投票

git remote prune origin为我解决了这个问题


0
投票

作为Windows用户,到目前为止,没有一个解决方案能够解决我的问题。我看到这个错误的原因是因为(使用OP的分支名称)我试图创建一个分支dev/sub但是其他人创建了一个名为Dev的分支,而且众所周知,windows有一个不区分大小写的文件系统。

因此,当Windows试图拉下dev/sub时,它首先尝试创建文件夹dev,但它不能因为Dev已经存在。

解决方案是使用Dev在本地和远程删除git branch -d Dev && git push origin :Dev分支。在此之后,git pull运行良好。

另一个教训是,分支名称应始终为小写以避免这种问题。


0
投票

如果所有其他方法都失败,请检查您的仓库系统没有分支名称的限制。在我的例子中,你只能创建以SD-<number>开头的分支。任何其他命名只会给你一个通用:

remote: error: cannot lock ref 'refs/heads/mybranch': 'refs/heads/mybranch/environment-variables' exists; cannot create 'refs/heads/mybranch'
To git.example.com:project/repository.git
 ! [remote rejected] mybranch -> mybranch (failed to update ref)
error: failed to push some refs to '[email protected]:project/repository.git'
© www.soinside.com 2019 - 2024. All rights reserved.