GIT:无法推送(奇怪的配置问题)

9

我正在一台全新安装的Linux Mint上操作。

在尝试从任何存储库中推送时,我遇到了以下错误:

error: Malformed value for push.default: simple
error: Must be one of nothing, matching, tracking or current.
fatal: bad config file line 8 in /home/leng/.gitconfig
fatal: Could not read from remote repository.

这很奇怪,因为我肯定有一个支持简单推送行为的版本。

git --version 命令的输出是 git version 1.8.3.2

~/.gitconfig 文件的内容:

[user]
    name = My Name
    email = MyEmail@website.com
[color]
    ui = true
[push]
    default = simple

这就是让人毛骨悚然的地方了。

如果我将行为更改为matching(或者更改为 nothing, tracking, 或者 current),然后尝试push,我会收到完全相同的错误消息。这怎么可能?它是否以某种方式缓存了配置?我甚至尝试重新启动过。我甚至尝试完全从系统中清除GIT(并删除 ~/.gitconfig)然后重新安装。

如果我从.gitconfig文件中完全删除[push]部分(或者完全删除该文件),然后尝试push,那么我会得到这个:

Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

error: Malformed value for push.default: simple
error: Must be one of nothing, matching, tracking or current.
fatal: bad config file line 8 in /home/leng/.gitconfig
fatal: Could not read from remote repository.

...所以看起来它既承认我没有选择推送行为,但又说我选择了不支持的行为。这到底是怎么回事?

即使我完全删除~/.gitconfig,我仍然会收到错误信息。

有人能帮我解决这个问题吗?

谢谢!

编辑:

这里是要求的.git/config文件:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = ssh://{my remote repo}
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

1
@Shivan 我不需要“current”模式。我不使用旧版本的Git。即使我将其设置为“current”,我仍然会得到完全相同的错误。 - Leng
但是错误是由于“push.default”的格式不正确。必须是nothing、matching、tracking或current之一。 - Raptor
@DavidGrayson 我在我的问题中包含了一个示例配置。但是我在每个仓库中都遇到了错误,即使是全新的、刚创建和克隆的仓库(这就是我从中获取配置文件的那个仓库)。感谢您的时间。 - Leng
配置文件的第8行是什么?我不确定错误和致命错误是否有关。 - Andreas Wederbrand
@Andreas:就是这个问题。甚至没有配置文件。我已经完全删除并重新安装了Git。就像它永久地存储了错误并反复输出它。(/home/leng/.gitconfig不存在。) - Leng
显示剩余2条评论
3个回答

4

好的,我已经修复了它,但是方法绝对是巫术。

我尝试通过清除GIT,删除配置文件,重新安装GIT,然后创建本地裸存储库,然后克隆它,再试图从那里推送来分离问题。就像这样:

sudo apt-get purge git-core
rm -f ~/.gitconfig
sudo apt-get install git-core
cd /git
mkdir foo
cd foo
git init --bare
cd /var/www
git clone /git/foo
cd foo
touch blah.txt
git add -A
git config --global user.name "Name"
git config --global user.email "user@email.com"
git commit -m "Blah"
git push

...仍然是完全相同的错误消息,没有任何改变。(仍然有一些严重的巫术。)

然后,我删除了一个没有本地源(它通过SSH连接到其源)的存储库,并在删除后使用全新的git clone ssh://...命令克隆了该存储库。

我从克隆命令中得到了一个错误:

remote: Malformed value for push.default: simple
remote: Must be one of nothing, matching, tracking or current.

Ah ha!现在它显示remote而不是error。所以远程服务器不支持这种行为。(然而,这并不能解释为什么只有本地仓库和本地源的情况下错误仍然存在。)
因此,我通过SSH登录到远程服务器并将git-core更新到最新版本,然后尝试从我的本地机器克隆存储库,并成功了。
现在,我终于可以git push。疯狂的是,这也使得我能够从完全本地的/var/www/foo完全本地的/git/foo(本地源裸仓库)进行git push。通过SSH登录到这个远程服务器并更新它,某种方式-巫术-修复了我的本地机器上的错误。
为什么完全本地的存储库关心另一台机器的GIT版本,这超出了我的理解范围。这是多么疯狂啊。

有趣,但是你的意思是什么,“我有一个通过SSH连接到其源并重新克隆了它的存储库之一。”“源”是什么?“它”是什么? - David Grayson
@David - 我的一个本地仓库通过SSH访问远程源。该源是一个裸仓库,您可以从中推送和拉取。我删除了整个本地仓库,然后再次克隆“它”-远程裸仓库-(git clone ssh://...)。 - Leng
1
恭喜你自己解决了这个问题! :-) 一个可能的解释是你在使用不兼容的 Git 客户端和 Git 守护程序的不同版本。这很奇怪,但我觉得你的 Git 守护程序根本不支持push.default大约5年前引入)。但正如你所说,这并不能解释本地仓库的不良行为。坦率地说,我现在找不到更好的解释,如果我想到或了解到新的信息,我会再次评论。 - jweyrich
@jweyrich 谢谢您!我也有类似的想法 - 但是 sudo apt-get purge git-core 似乎会删除甚至是守护进程和其他相关软件包,所以我不知道在完全清除和重新安装后如何解决问题!我永远不会忘记这个巫术。我仍然感到毛骨悚然。 - Leng

3

我在执行git push的时候也遇到了同样的错误信息。

后来发现远程用户的git是一个较旧的版本(1.7.2.5),而我最近更新了远程的~/.gitconfig,其中包含了:

[push]
  default = simple

解决方案是从远程配置中删除此设置。

感谢您抽出时间发布您的解决方案! :) - Leng

2
由于其他人也遇到了这个问题,并且我在这里找到了解决方案,所以我想发布一下对我有效的解决方案。
简而言之,我发现的解决方案在这个页面上。显然,最好的解决方案是升级到更新版本的Git(如果可能的话)。但是对我来说,这不是一个选项。从本地机器上,我输入了以下命令: git config -–global push.default upstream 这样就解决了我一直遇到的“Malformed value for push.default: simple”错误。但是,我并不完全确定upstream的作用。
与此相比,我的情况是:我在远程计算机上有一个空的(bare)存储库,并且在几台“本地”工作站上有一些存储库。我从远程存储库中拉取代码,进行一些工作,然后将我的工作推送到远程存储库中。推送/拉取是通过SSH完成的。大多数时候,在本地机器上工作时,推送/拉取会导致上述错误。
简而言之,在修复之前,我在远程机器上有以下~/.gitconfig文件:
[user]
        name = Foo Bar
        email = FooBarPerson@email.com
[diff]
        external = /Users/foobar/bin/git-diff-cmd.sh
[color]
        diff = auto
        status = auto
        branch = auto
[push]
        default = simple

在输入以上命令后,我在远程机器上的~/.gitconfig文件发生了变化:
[user]
        name = Foo Bar
        email = FooBarPerson@email.com
[diff]
        external = /Users/foobar/bin/git-diff-cmd.sh
[color]
        diff = auto
        status = auto
        branch = auto
[push]
        default = upstream

版本信息:

  • 远程机器(仓库位置):1.9.4
  • 我的笔记本电脑:1.8.5.2(Apple Git-48)
  • 我使用的其他计算机:1.7.7.4

这是另一个可能对某些人有用的网站: http://www.lorrin.org/blog/2011/10/03/argumentless-git-pull-and-git-push/comment-page-1/


感谢您抽出时间发布您的上下文和解决方案! - Leng

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