90

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

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
4

10 回答 10

80

如果有人因为他们特别想获取当前分支而发现这个,您可以使用该--update-head-ok标志。从文档

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

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

于 2013-10-06T05:17:03.093 回答
47

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

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

这将设置要提取到的存储库remotes/otherrepo/*git fetch otherrepo应该做的伎俩。Alternativeley,您可以手动编辑您的.git/configfetch为遥控器设置为refs/heads/*:refs/remotes/otherrepo/*.

于 2010-02-10T12:45:16.180 回答
9

如果您在分支中并且想要获得最新版本,这也应该可以尝试这个

git pull 起源大师

于 2017-04-13T18:45:29.300 回答
2

要在获取 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
于 2021-08-27T11:10:17.113 回答
0

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

git init; git fetch $REMOTE_GIT_REPOSITORY_URL  

然后git pull并且git push会做正确的事情。根据迈克尔更有效和更有原则的答案,避免的优点git remote是您不需要考虑跟踪分支的语义。

于 2011-09-14T12:14:04.907 回答
0

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

git fetch [remote_name] [branch_name] 

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

git pull [remote_name] [branch_name]

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

git push [remote_name] [branch_name_local] 
于 2015-04-11T06:10:19.787 回答
0

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

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

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

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


我有一个项目,我从 C# 代码调用 Git 可执行文件,当我不小心忘记设置-C parameter.

于 2017-09-08T19:12:51.567 回答
0

当您真的想获取当前分支时 - 例如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]...
于 2021-03-07T19:21:38.130 回答
0

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

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

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

请参阅Anders Kaseorg ( ) 的提交593a2a5提交 9fdf4f1提交 38baae6提交 8bc1f39提交 c8dd491提交 7435e7e提交 c25edee提交 66996be(2021 年 12 月 1 日(由Junio C Hamano 合并——提交 13fa77b中,2021 年 12 月 21 日)andersk
gitster

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

签字人:Anders Kaseorg

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

修复了这个先前报告的错误

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

于 2021-12-24T18:10:21.273 回答
-1

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

我在本地创建了一个分支 BRANCHNAME 然后执行了命令“ git fetch upstream pull/ID/head:BRANCHNAME ”并得到了致命的:拒绝获取非裸存储库的当前分支 refs/heads/BRANCHNAME

然后我删除了分支并再次调用相同的 cmd 它很好。

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

于 2019-02-25T12:19:10.007 回答