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

时间:2014-03-25 09:33:58

标签: git

这不可能在服务器上的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文件夹。

出了什么问题?

12 个答案:

答案 0 :(得分:79)

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

  • 如果存在分支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 {1}}。然后,您可以创建一个名为dev/renamed-sub的本地分支指向同一个提交,在远程创建dev/renamed-sub,删除远程dev/sub,然后创建dev/sub/master在遥控器上。)


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

答案 1 :(得分:33)

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

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

答案 2 :(得分: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

答案 3 :(得分:8)

对我来说->

错误=

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

答案 4 :(得分:2)

尝试使用此命令修复它:

git gc

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

了解详情:git help gcgit help prune

答案 5 :(得分: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. git pull
  4. git push

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

因此,当Windows尝试拉下dev/sub时,它首先尝试创建文件夹dev,但由于Dev已经存在而无法创建文件夹。

解决方案是使用Dev在本地和远程删除git branch -d Dev && git push origin :Dev分支。在此之后的git pull就可以了。

下一课,分支名称应始终为小写,以避免此类陷阱。

答案 8 :(得分: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 'git@git.example.com:project/repository.git'

答案 9 :(得分:0)

我知道这个问题已经得到回答,但是对我没有用。我并不关心本地更改,因为它已经被推高了,但是问题又拉回去了。就我而言,我们在以“修补程序”作为分支到以父文件夹为“修补程序”的文件夹系统之间进行了一半的更改。

-修补程序 ---- hotfix / 1234_bug ---- hotfix / 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'

寻找类似的错误之后,我终于在讨论线程here上找到了解决方案。

git remote prune origin

答案 10 :(得分:0)

git checkout -b hotfix/my-new-branch

ga
gm "my commit"

gp --set-upstream origin hotfix/subscribers-function

答案 11 :(得分:0)

'package:pdf/widgets.dart' as pw;重命名为dev/sub,然后可以创建分支dev/sub/something