git拒绝获取当前分支


77

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

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

您能否显示要获取的存储库的配置?
CB Bailey 2010年

嗯,我怎么看到那个配置?我只是使用设置了远程存储库git remote add name server(可能带有--mirror选项)。
Olivier Verdier'2

Oliver,配置在中.git/config[remote …]我相信,查尔斯特别是在谈论这一部分。
Michael Krelin-黑客2010年

我的配置如下所示:[remote“ origin”] url = ssh:// blablablah fetch = + refs / *:refs / * mirror = true
Olivier Verdier 2010

您不应该镜像获取所使用的存储库。您想要的是移除镜像,并且基本上按照我在答案中给出的建议进行操作。
Michael Krelin-黑客2010年

Answers:


42

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

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

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


谢谢!我不太了解自己在做什么,但是按照您的建议,现在可以正常工作了。我有点猜测,必须明确说出远程分支将在本地存储库中结束的位置。我可能有一个与本地分支重叠的远程分支,尽管我不确定这是否有意义。:-) 不管怎么说,还是要谢谢你!
Olivier Verdier'2

1
或多或少。远程引用位于“ refs / remotes”中的事实只是一个惯例,但您确实不希望直接获取到“ refs / hreads / master”中。特别是当您的“裁判/负责人/大师”签出时。
Michael Krelin-黑客2010年

@ MichaelKrelin-hacker我应该写些什么代替“ thehost”
Punit Vara

存储库所在的主机的名称。基本上,该thehost:/the/path.git部分应替换为您的存储库URL。
Michael Krelin-黑客

69

万一有人因为特别想获取当前分支而发现此消息,则可以使用该--update-head-ok标志。从文档

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

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


3
在这种情况下,为什么git不想要更新头部?他们为什么不希望您使用此标志?
克里斯·马里西克

我也很好奇,为什么除了当前分支外,fetch还可以更新所有其他分支?
cdosborn

3
我认为限制是为了防止您失去工作,但我确认即使使用了-u标志,非快速提交也被拒绝:! [rejected] master -> master (non-fast-forward)
Diomidis Spinellis

3
如果您只是想丢掉主人,并把它指向起源的主人:git fetch -fu origin master
cdosborn

请注意,这将更新头,但不会更新工作目录。要使工作目录与头部匹配,请使用git reset --hard(小心,这将丢弃所有未保存的更改)。
Erik Koopmans

5

如果您在master分支中并且想要获得最新的尝试,这也应该工作

git pull起源大师


0

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

git init; git fetch $REMOTE_GIT_REPOSITORY_URL  

然后git pullgit push将做正确的事情。git remote按照Michael更有效,更原则的回答,避免使用的好处是您无需考虑跟踪分支的语义。


克隆是克隆。“主仓库”纯粹是一个约定。这里的问题是关于将HEAD设置为ref时“ git fetch remote ref:ref”的行为。
qneill 2012年

0

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

git fetch [remote_name] [branch_name] 

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

git pull [remote_name] [branch_name]

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

git push [remote_name] [branch_name_local] 

0

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

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

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

  2. 总是传递-C参数到Git的指定与本地回购的目录。


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


-1

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

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

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

其实我正在检查拉请求分支。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.