Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git push:refs/heads/my/subbranch存在,无法创建_Git - Fatal编程技术网

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

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'

无法在服务器上的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': 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——删减源代码
    更新远程分支的本地副本(这实际上对我没有帮助

  • git-remote-prune-origin
    remove有关已删除远程分支的信息(确实如此

尝试使用此命令修复它:

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更新参考-d参考/标记
  • git获取
  • 吉特拉力
  • git推送
  • 这对我没有帮助,因为我没有远程回购协议的参考文件要删除-它完全是在我的本地!因此,如果您遇到这种情况,请执行以下操作:

    这就是我面临的问题:

    $ 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
    .A
    git 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