git拒绝获取当前分支

时间:2010-02-10 12:33:19

标签: git fetch

我设置了一个远程存储库,我可以对其进行新的更改,但是我无法从中获取,我总是得到(相当神秘的)错误消息:

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

8 个答案:

答案 0 :(得分:47)

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

  

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

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

答案 1 :(得分:31)

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

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

这将设置要提取到remotes/otherrepo/*的存储库。 git fetch otherrepo应该做到这一点。另外,您可以手动修改.git/config,并将遥控器的fetch设置为refs/heads/*:refs/remotes/otherrepo/*

答案 2 :(得分:5)

如果您在分支并且想要获得最新信息,那么这应该可以使用

  

git pull origin master

答案 3 :(得分:1)

当我不假思索地克隆存储库而不是获取存储库时,我遇到了这个问题,因此这两个存储库都是主存。如果您没有对远程存储库执行任何操作,则可以使用基本git命令进行修复,如下所示:(1)删除远程存储库,(2)将本地存储库复制到远程存储库所在的位置,(3)删除local one,然后(4)使用

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

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

答案 4 :(得分:0)

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

有两种方法可以做到这一点:

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

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

  3. 我有一个项目,我从C#代码调用Git可执行文件,当我意外忘记设置-C parameter时,我得到了同样的错误消息。

答案 5 :(得分:0)

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

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

然后我删除了分支,然后再次调用相同的cmd。

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

答案 6 :(得分:0)

当你真的想进入当前分支时 - 例如像来自双存储库的 const mockApi = { request: (response) => { return new Promise((resolve, reject) => { setTimeout(() => resolve(response), 1000) }) }, getArray() { return this.request(['foo', 'bar', 'baz']) }, getItem(item) { return this.request(`Resolved: ${item}`) } } async function getData() { const array = await mockApi.getArray(); const final = await Promise.all(array.map(e => mockApi.getItem(e))); console.log(final) } getData()(而不是像 OP 案例中那样由于虚假配置),您可以更方便地这样做:

fetch -u origin mybranch:mybranch

这仅允许快进更新,扩展线性历史。与 git pull [origin] --ff-only 不同,它已经更新了索引。

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

fetch -u

可以分为:

git pull --rebase[=interactive]

答案 7 :(得分:-1)

我有同样的问题。首先,我尝试使用此

获取
git fetch [remote_name] [branch_name] 

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

git pull [remote_name] [branch_name]

注意将获取并合并更改。如果你使用终端然后文件打开,需要提交消息。有了这条消息,您将推送最新的提交。尝试此命令,最后您将能够推送请求。

git push [remote_name] [branch_name_local]