【问题标题】:git refusing to fetch into current branchgit拒绝获取当前分支
【发布时间】:2011-01-15 06:09:57
【问题描述】:

我设置了一个远程存储库,我可以向它推送新的更改,但我无法从中获取,我总是收到(相当神秘的)错误消息:

fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
fatal: The remote end hung up unexpectedly

这是什么意思?我应该怎么做才能启用抓取?

(请注意,此远程存储库仅用作备份存储库,因此它应该几乎是我本地存储库的精确副本。我真的不明白为什么我可以推送到它但不能从中获取.. .)

我的配置如下:

[remote "origin"]
    url = ssh://blablablah
    fetch = +refs/*:refs/*
    mirror = true

【问题讨论】:

  • 你能显示你正在获取的存储库的配置吗?
  • 嗯,我怎样才能看到那个配置?我刚刚使用git remote add name server 设置了那个远程存储库,也许使用了--mirror 选项。
  • 奥利弗,配置在.git/config。特别是,查尔斯在谈论[remote …] 部分,我相信。
  • 我的配置看起来像这样:[remote "origin"] url = ssh://blablablah fetch = +refs/*:refs/* mirror = true
  • 你不应该镜像到你工作的存储库。您想要的是删除镜像,并且基本上遵循我在答案中给出的建议。

标签: git git-fetch


【解决方案1】:

如果有人发现这个是因为他们特别想提取到当前分支,您可以使用--update-head-ok 标志。来自the docs

-u
--update-head-ok
默认情况下 git fetch 拒绝更新当前分支对应的头部。此标志禁用检查。这纯粹是为了 git pull 与 git fetch 进行通信的内部使用,除非您正在实现自己的 Porcelain,否则您不应该使用它。

在某些情况下,我们确实希望实现自己的瓷器命令,例如自动化和工具。

【讨论】:

  • 为什么在这种情况下 git 不想更新头部?为什么他们不希望你使用这个标志?
  • 我也很好奇,为什么 fetch 可以更新除当前分支之外的所有其他分支?
  • 我认为限制是为了防止你失去工作,但我证实即使使用-u 标志,非快进提交也会被拒绝:! [rejected] master -> master (non-fast-forward)
  • 如果你想扔掉你的主人,把它指向源头的主人:git fetch -fu origin master
  • 请注意,这将更新头部,但不会更新工作目录。要使工作目录与头部匹配,请使用git reset --hard(小心,这将丢弃任何未保存的更改)。
【解决方案2】:

您要做的是获取您正在处理的分支。也就是说,您 在 master 分支上并且您尝试更新它。那是不可能的。更新remotes/* 分支然后将其拉入本地分支更为常见。你想要的是,也许,

git remote add otherrepo thehost:/the/path.git

这将设置存储库以获取到remotes/otherrepo/*git fetch otherrepo 应该可以解决问题。 Alternativeley,您可以手动编辑您的.git/config 并将遥控器的fetch 设置为refs/heads/*:refs/remotes/otherrepo/*

【讨论】:

  • 谢谢!我真的不明白我在做什么,但按照你的建议,它现在可以正常工作了。我猜想必须明确说明远程分支将在本地存储库中的最终位置;我的远程分支可能与我的本地分支重叠,尽管我不确定这是否有意义。 :-) 还是谢谢!
  • 或多或少。远程 refs 在“refs/remotes”中的事实只是一个约定,但你真的不想直接获取到你的“refs/hreads/master”。特别是当你的“refs/heads/master”被签出时。
  • @MichaelKrelin-hacker 我应该写什么来代替“thehost”
  • 存储库所在主机的名称。基本上,thehost:/the/path.git 部分应该替换为 your 存储库 url。
【解决方案3】:

如果您在 ma​​ster 分支中并且想要获得最新的尝试,这应该可以工作

git pull origin ma​​ster

【讨论】:

    【解决方案4】:

    要在获取 PR 以进行本地测试时处理此问题,只需签出另一个分支,然后获取 PR。

    git checkout -b feature-branch # create a branch to fetch changes into.
    git checkout master # or main
    git fetch origin pull/5/head:add-feature # fetch pull request by ID
    git checkout feature-branch
    

    【讨论】:

      【解决方案5】:

      当我漫不经心地克隆存储库而不是获取它时,我遇到了这个问题,因此两个存储库都是主存储库。如果您没有对远程存储库进行任何操作,您可以使用以下基本 git 命令修复:(1)删除远程存储库,(2)将本地存储库复制到远程存储库,(3)删除本地一个,然后 (4) 使用

      设置本地存储库
      git init; git fetch $REMOTE_GIT_REPOSITORY_URL  
      

      然后git pullgit push 会做正确的事情。根据 Michael 更有效和更有原则的回答,避免 git remote 的优点是您无需考虑跟踪分支的语义。

      【讨论】:

      • 克隆就是克隆。 “主回购”纯粹是一种约定。这里的问题是关于 HEAD 设置为 ref 时“git fetch remote ref:ref”的行为。
      【解决方案6】:

      我也有同样的问题。首先我尝试使用这个来获取

      git fetch [remote_name] [branch_name] 
      

      我遇到了你提到的同样的问题。之后我尝试了这个简单的命令。

      git pull [remote_name] [branch_name]
      

      Note 将获取并合并更改。如果您使用终端然后文件打开,需要提交消息。使用此消息,您将推送最新的提交。试试这个命令,最后你就可以推送请求了。

      git push [remote_name] [branch_name_local] 
      

      【讨论】:

        【解决方案7】:

        您实际上是在命令行中输入 Git 命令,还是从您自己的代码运行 Git 可执行文件?
        如果您是从代码运行它,您确定 Git 正在尝试获取进入正确的本地目录?

        有两种可能的方法来做到这一点:

        1. 在执行 Git 之前使用您的编程语言提供的选项设置正确的工作目录
          C# example,因为这是我正在使用的)

        2. 始终将 the -C parameter 传递给 Git 以指定具有本地 repo 的目录。


        我有一个项目,我从 C# 代码调用 Git 可执行文件,当我不小心忘记设置 -C parameter 时,我收到了与问题中相同的错误消息。

        【讨论】:

          【解决方案8】:

          当你真的想进入当前分支时 - 例如就像来自双仓库的fetch -u origin mybranch:mybranch 一样(而不是由于像 OP 案例中那样的虚假配置),您可以更方便地这样做:

          git pull [origin] --ff-only
          

          这仅允许快进更新,扩展线性历史。与fetch -u 不同,它已经更新了索引。

          如果由于不同的提交历史而导致失败并且您想立即再次实现统一(而不是创建合并 daimonds 等),您可以考虑重新定位到远程 - 例如作者:

          git pull --rebase[=interactive]
          

          可以分为:

          git fetch origin mybranch
          # inspect the diverge situation 
          git rebase origin/mybranch mybranch [-i]...
          

          【讨论】:

            【解决方案9】:

            请注意,此错误消息不仅适用于您当前的分支,还适用于以worktree 签出的任何分支。

            "git fetch"(man) 没有 --update-head-ok 选项应该保护已签出的分支不被更新,以防止将其签出的工作树退出同步。

            代码是在使用“git worktree”之前编写的(man) 被广泛使用,并且只检查了当前工作树中签出的分支,该分支已更新为Git 2.35(2022 年第一季度)。

            参见commit 593a2a5commit 9fdf4f1commit 38baae6commit 8bc1f39commit c8dd491commit 7435e7ecommit c25edeecommit 66996be(2021 年 12 月 1 日)Anders Kaseorg (andersk)
            (由Junio C Hamano -- gitster -- 合并于commit 13fa77b,2021 年 12 月 21 日)

            fetch: 保护所有工作树中签出的分支

            签字人:Anders Kaseorg

            拒绝获取任何工作树的当前签出分支,而不仅仅是当前分支。

            修复了这个previously reported bug

            作为使用 find_shared_symref, 的副作用,当我们在分离的 HEAD 上时,我们也会拒绝提取,因为我们正在相关分支上重新定位或平分。
            这似乎是一个明智的改变。

            【讨论】:

              【解决方案10】:

              致命:拒绝获取非裸存储库的当前分支 refs/heads/BRANCHNAME

              我在本地创建了一个分支 BRANCHNAME 然后执行命令“git fetch upstream pull/ID/head:BRANCHNAME” 并得到fatal: Refusing to fetching into current branch refs/heads/BRANCHNAME of non-bare repository

              然后我删除了分支并再次调用相同的 cmd 就可以了。

              实际上我正在检查拉取请求分支。

              【讨论】:

                猜你喜欢
                • 2015-09-26
                • 2013-09-10
                • 2023-03-09
                • 1970-01-01
                • 1970-01-01
                • 2013-02-10
                • 2011-09-08
                • 2017-08-11
                相关资源
                最近更新 更多