致命错误:在./config中'receive.denycurrentbranch'的配置值有误。

7
我使用git将提交的更改推送到服务器上的存储库。现在出现了这个错误:
$ git push -u origin master
fatal: bad config value for 'receive.denycurrentbranch' in ./config
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

控制台窗口中的错误信息

我猜测这个错误可能是由于SSH连接失败导致的。我使用PuTTY通过SSH连接我的Web服务器。然而,我还是一个新手,不太清楚它是如何工作的。

所以我尝试了在线生成私钥,下载并将其转换为PPK格式,并将其放入PuTTY的认证选项卡中。当我通过PuTTY登录时,我必须输入密钥密码,然后它就可以无错误地连接。

错误只出现在Git Bash中。那么我该如何修复它呢?我是否需要告诉Git使用PuTTY作为我的SSH代理(SSH代理到底是什么?)?或者Git默认使用Windows 10的OpenSSH?

我也尝试过使用

$ eval $(ssh-agent -s)
$ ssh-add ~/.ssh/id_rsa

但我不确切知道它是做什么的。它只是启动了OpenSSH-Agent吗?

如果有人能帮我澄清一下,我会非常高兴的。我已经用谷歌搜索了一天,虽然一点点拼凑起来了,但我还没有解决那个特别的问题。谢谢!:)

更新19.7.19

问题还没有完全解决。是的,将服务器端的receive.denycurrentbranch设置为ignorerefuse可以使错误消失。我可以推送,然而没有文件显示。显然,仓库中只保存提交,而不是文件本身。正如我所想的,我需要updateInstead选项,它允许存在非裸仓库(具有实际文件而不仅仅是提交的仓库),以便服务器可以从仓库中获取这些文件并将它们部署在我的public_html文件夹中。

我的服务器git版本是2.19.1,似乎比需要解释updateInstead-参数的2.4.0版本更高。所以这仍然是一个谜团。

我现在正在尝试在我的服务器上安装一个新的git版本,只是为了看看那是否改变了什么。然而,我在那里遇到了一个不同的问题。请访问这个线程


可能是 Git receive.denyCurrentBranch updateInstead fails 的重复问题。 - phd
https://stackoverflow.com/search?q=%5Bgit%5D+fatal%3A+bad+config+value+for+receive.denycurrentbranch - phd
只是为了明确,receive.denycurrentbranch 是服务器端的一个设置。在你的个人电脑上没有任何作用。 - VonC
6个回答

18

我知道这是一个旧问题,但我已经解决了它,并想为其他人发布解决方案。

问题似乎是您的托管提供商上有2个git安装。其中一个安装在\usr\bin中并被默认使用。这个可能是1.8.*或早于2.4的版本。另一个安装在应用程序目录中,并链接到您的路径中。因为git不运行完整的shell,所以默认的“旧”版本被使用,而不是在ssh会话中运行时从git version获取的版本。要解决此问题,请首先查看ssh会话下的git-receive-pack的路径:

which git-receive-pack 

然后在您的本地计算机上更新您的远程配置:

git config remote.<remote-name>.receivepack <receive-pack-path>

那应该可以解决你的问题。


9

谢谢。这对于使用SSH推送到GoDaddy共享主机仓库非常有帮助。 - Saifur Rahman Mohsin
1
这是一个正确的答案。但@aaron-dalton的答案更好。如果你在仓库配置中定义了receive-pack,那么你就不必在每次新的push中用命令行重新定义它了。 - cartbeforehorse

2
我也遇到了同样的问题。当我运行命令 git --version 时,它显示为 2.24.1,但是它不接受上面提到的 updateInstead 命令。
我采用以下方法解决了这个问题:
  1. 运行以下命令。
which git

它会给你git的路径。
示例输出:
/usr/local/cpanel/3rdparty/lib/path-bin/git

请到~/.bashrc文件中,在文件底部添加以下代码。
export PATH=/usr/local/cpanel/3rdparty/lib/path-bin:$PATH

*请注意,我在路径末尾没有包含git

希望这能解决问题。


2

我在Bluehost托管上设置了一个git仓库。那里的git版本是2.19.1。我通过cPanel创建了该仓库。我发现了与'receive.denycurrentbranch'相同的问题。

我成功通过编辑git配置文件来解决这个问题。它们现在看起来像:

全局配置(git config --global --edit)

[receive]
#       denyCurrentBranch = updateInstead
#       denyNonFastForwards = true

本地仓库配置(git config --edit)
[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
        logallrefupdates = true
        symlinks = false
[receive]
#       denyCurrentBranch = updateInstead
[gc]
        auto = 0

0

使用 receive.denycurrentbranch 忽略问题并不能解决它,反而会在以后造成更多问题。我建议你按照以下步骤操作:

这样肯定能解决你的问题,因为我曾经花费了五个小时来寻找同样的问题。

  1. 首先使用ssh命令git --version检查远程GIT版本。在我的情况下,它是2.19.1,这是问题的根本原因。

  2. 我建议在开始以下过程之前在cPanel上创建一个新的repo,在创建新的repo之后,请检查以下内容...

  3. 现在确保在远程配置denyCurrentBranch = updateInstead,以下是我的远程配置截图,您可以使用命令git config --edit在远程repo目录中时检查远程配置。我的实时git配置截图

  4. 现在在本地克隆cpanel repo,并检查您的本地git配置文件,确保它具有标记[remote "origin"],如果找不到,请在本地使用以下命令git remote add origin ssh://username@website/home/username/reponame

  5. 现在只需添加任何测试文件并提交更改,然后使用以下命令推送,您的远程repo将得到100%的更新git push origin master -u --exec=/usr/local/cpanel/3rdparty/bin/git-receive-pack

此致!


缺少截图。 - Volomike

0
你遇到的问题是你为receive.denycurrentbranch选项设置了无效的配置值。从你的控制台窗口看,你似乎有一个不理解refuse值的Git版本(或者你在值中输入了类似于非断空格的东西)。
你应该知道这个值只适用于服务器端。在客户端上设置它没有任何效果。你应该通过编辑config(或.git/config,视情况而定)文件并删除相应的选项来将其从配置中移除,这样就可以使推送工作正常了。

啊,我必须说这对任何值都不起作用。我已经尝试过 ignore, refuse, updateInstead,但它们都不起作用。或者你是指我需要在服务器端更改配置文件吗? - glades
你遇到的推送问题是由于客户端出现了错误值;你必须编辑客户端配置文件以删除无效设置。如果你想让你所设置的选项对推送产生任何影响(除了产生错误),它必须在服务器端而不是客户端上设置。 - bk2204
谢谢,但我应该使用哪个选项来代替“refuse”?一开始它被设置为“updateInstead”,但这也不起作用,所以我试着进行了更改。 - glades
不要在客户端设置它(您可以使用“git config --unset receive.denycurrentbranch”将其删除)。登录服务器并仅在那里设置它(如果您有足够新的Git,则应该使用“updateInstead”)。 - bk2204
1
它奏效了。我在服务器端设置了receive.denycurrentbranchignore。因为本地和服务器端的git版本都低于2.4,所以之前的updateInstead值无法被服务器git解释。 - glades
1
仍未完全解决。是的,在服务器端将receive.denycurrentbranch设置为ignorerefuse可以修复错误。我可以推送。然而,正如我所想的那样,我需要updateInstead选项,它允许非裸库(具有实际文件而不仅仅是提交的存储库)存在,以便系统可以从那里部署我的网站。我的服务器git版本是2.19.1,似乎比需要解释updateInstead的2.4.0版本更高。那么可能还有什么问题呢? - glades

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接