git push:refs/heads/my/subbranch存在,无法创建
无法在服务器上的repo中创建somme子文件夹吗 如果我这样做:git push:refs/heads/my/subbranch存在,无法创建,git,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 push origin :fix error: unable to delete 'fix'
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 push origin :fix
error: unable to delete 'fix': remote ref does not exist
error: failed to push some refs to <repo URL>
我使用“git branch-r”并直接使用ssh进行了检查,没有创建dev/sub文件夹
怎么了?它不是一个存在的文件夹,而是一个分支。(好吧,可能有一个文件夹/目录涉及某个地方,也可能没有,因为引用被“打包”并不再作为目录中的文件存在。)
- 如果分支
存在,则无法创建名为b
b/的分支。
- 同样,如果分支
存在,则无法创建dev/b
。dev/b/c
这是git的内部限制。在这种特殊情况下,remote
origin
有一个名为dev/sub
的分支(无论您是否拥有它,重要的是远程是否拥有它)。为了在origin
上创建名为dev/sub/master
的分支,必须首先删除origin
上名为dev/sub
的分支:
git push origin :dev/sub
(当然,删除此分支可能会删除那边的一些重要内容,因此请确保您知道自己在做什么。通常,您可能希望首先git获取origin
,将它们的dev/sub
捕获为您的origin/dev/sub
。然后,您可以创建一个名为dev/rename sub
的本地分支,指向同一个co。)mmit,在远程上创建dev/sub
,删除远程dev/sub
,然后在远程上创建dev/sub/master
。)
如果您可以登录到远程(源代码所在的系统),您可以进入那里的存储库,只需重命名本地
dev/sub
分支即可。(根据下面的评论,我怀疑那里也有一个损坏的自动部署脚本,可能应该将其修复为仅部署“可部署的”分支,而不是所有被推送的分支。但我只是在这里猜测。)我当时处于无法获取的状态,因为我的回购协议中有关于不存在的远程分支的信息,我甚至没有签出。
我通过运行以下组合(感谢@torek)解决了这个问题:
列出远程分支的本地副本git分支-r
列出远程分支git ls remote
更新远程分支的本地副本(这实际上对我没有帮助)git fetch——删减源代码
remove有关已删除远程分支的信息(确实如此)git-remote-prune-origin
git gc
要在当前存储库中运行大量内务管理任务并删除无法访问的对象(通过调用git prune
和git fsck--unreachable
)
阅读更多信息:git-help-gc
和git-help-prune
#!/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来修复错误:
$ 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 remote prune origin
Pruning origin
URL: <redacted>
* [pruned] origin/fix
$git远程修剪源
修剪原点
网址:
*[删减]来源/修复
这样,问题就消失了:
$ 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
$git获取来源
远程:计数对象:5,完成。
远程:共5个(增量2),重复使用2个(增量2),包重复使用3个
拆包对象:100%(5/5),完成。
从…起
*[新分行]固定/支行->来源/固定/支行
git remote prune origin为我解决了这个问题为我-->
错误=
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
作为一个windows用户,迄今为止没有任何解决方案为我解决了这个问题。我之所以看到这个错误,是因为(使用OP的分支名称)我试图创建一个分支
dev/sub
,但其他人创建了一个名为dev
的分支。众所周知,windows有一个不区分大小写的文件系统
因此,当windows尝试下拉dev/sub
时,它首先尝试创建文件夹dev
,但它不能,因为dev
已经存在
解决方案是使用git branch-d Dev和&git push-origin:Dev
.Agit pull
本地和远程删除Dev
分支
接下来的另一个教训是,分支名称应始终使用小写字母,以避免出现这种情况。如果所有其他操作都失败,请检查您的回购系统是否对分支名称没有限制。在我的情况下,您只能创建以
SD-
开头的分支。任何其他命名都只会给您一个通用名称:
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'
我知道这已经得到了回答,但对我来说不起作用。我不关心本地更改,因为它已经被推上了,但有一些问题需要解决。在我的情况下,我们在将“热修复程序”作为分支到将父文件夹作为“热修复程序”的文件夹系统之间进行了中途更改 --修补程序 ----修补程序/1234_错误 ----修补程序/3456_错误 所以我得到了以下错误:
Fetching from origin Error: cannot lock ref 'refs/remotes/origin/hotfix/1234_bug': 'refs/remotes/origin/hotfix' exists; cannot create 'refs/remotes/origin/hotfix'
在搜索类似的错误后,我终于在一个讨论线程上找到了解决方案
将
dev/sub
重命名为dev/sub/something
,然后您可以创建分支dev/sub/master
git ls远程源代码返回什么?我想我们只是在术语上大惊小怪。通过“内部限制”我的意思是,git可以在不改变任何人使用git的方式的情况下克服这一点。无条件限制应该是更基本的限制,例如,如果有人违反了SHA1:即使这样也可能是错误的
Fetching from origin Error: cannot lock ref 'refs/remotes/origin/hotfix/1234_bug': 'refs/remotes/origin/hotfix' exists; cannot create 'refs/remotes/origin/hotfix'
git remote prune origin
git checkout -b hotfix/my-new-branch
ga
gm "my commit"
gp --set-upstream origin hotfix/subscribers-function