Python 吉特;未能将某些引用推送到…”;使用自定义Git桥

Python 吉特;未能将某些引用推送到…”;使用自定义Git桥,python,git,paramiko,Python,Git,Paramiko,我一直在使用Paramiko作为git的SSH桥来设置git服务器。我可以毫无问题地克隆我的存储库,甚至可以推送更改,但我会收到一条恼人的错误消息 Pushing to git@localhost:/pckprojects/heyworld Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100%

我一直在使用Paramiko作为git的SSH桥来设置git服务器。我可以毫无问题地克隆我的存储库,甚至可以推送更改,但我会收到一条恼人的错误消息

Pushing to git@localhost:/pckprojects/heyworld
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 262 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@localhost:/pckprojects/heyworld
     348dfdc..1c0468e  master -> master
updating local tracking ref 'refs/remotes/origin/master'
error: failed to push some refs to 'git@localhost:/pckprojects/heyworld'
我的git配置如下所示:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
    sharedRepository = all
[receive]
    denyNonFastForwards = false
    denyCurrentBranch = false
    denyDeletes = false
奇怪的是,“master”实际上得到了更新,而我在存储库中没有其他分支。此外,如果我从磁盘而不是通过SSH克隆/推送存储库,我看不到任何错误

有人知道我为什么会看到这个错误吗

谢谢

编辑:

由于我的问题似乎与SSH服务器有关,因此主循环如下:

        proc = subprocess.Popen(command, stdin=subprocess.PIPE,
                stdout=subprocess.PIPE, stderr=subprocess.PIPE)

        while True:
            try:
                r_ready, w_ready, x_ready = select.select(
                    [channel, proc.stdout, proc.stderr], [proc.stdin], [])
            except Exception, e:
                print e
                print 'channel: ' + str(channel)
                print 'proc: ' + str(proc)

            if channel in r_ready and channel.recv_ready():
                data = channel.recv(128)
                if len(data) > 0:
                    print 'IN>channel ' + repr(data)
                    proc.stdin.write(data)
                else:
                    pass

            if proc.stdout in r_ready:  
                data = proc.stdout.read(1)
                channel.sendall(data)

            if proc.stderr in r_ready:

                data = proc.stdout.read(1)
                if len(data) > 0:
                    channel.sendall(data)

                else:
                    print "Encountered empty stderr, breaking"
                    break                       

        print 'will close'
        channel.shutdown(2)
        channel.close()
更多信息

我想这可能有助于了解实际的沟通情况。这是在服务器端,因为git客户端不允许您看到这么多

git-receive-pack /home/www/data/project/heyworld/

OUT >>
00721ee2436e45c80236878132dc87d9e9fee6a81de5 refs/heads/master\x00 report-status delete-refs side-band-64k ofs-delta\n0000

IN >>
00841ee2436e45c80236878132dc87d9e9fee6a81de5 6054b3358787bafd1d96c0fdfbf016d620ccdf09 refs/heads/master\x00 report-status side-band-64k0000

IN >>
PACK\x00\x00\x00\x02\x00\x00\x00\x03\x96\x0ex\x9c\xa5\x8cM\x0e\xc2 \x14\x06\xf7\x9c\x82\x0b\xd8<(?\x8f\xc4\x18\xf7n\xbc\x02\xc2\x87%\x16\xdb4\xb8\xf0\xf66\xbd\x82\xcb\x99d\xa6o\x80\x846\xd9!)\x1b\x0b\xb1\r1$dO\x05\xa6\xb0\xa3@\x06%D<\xb2\x16k\xdc\xf0\xeeRa/F\x07c\x13\x93\x1e\x1d{V\xa3\xce\x89}\x0e\x08\x05p\x91U\x86\x15\xf1\xd3\xa7e\x93\xf7\xa9\xceu\x95\xb7\xda\x1a\xbe\xf2\xbc\x1e8\xbc\x0e\xbc>[\xac\xf3\x90\x96v\x91J\xfb`X\xb3V\xf2D\x96H\xec\xb6\xd5\xde\xf1\xc7B4,\xe2\x07\xff\x8aF\xba\xaf\x01x\x9c340031Q\xc8H\xaddP\xd8P\xfcmzGg\x8aY\xc4\x8e\xad\xb1<\xca\x1b\xa3\x93\xee\xbd\x05\x00\xa8\xb4\x0c\x9by\xd3\xfe\xa0C\x86fU\x18\xbe\xa5\x86\xac5*\xf7\x11\x89\x8b9$x\x9c\x0b\x8b\x9a\x10\xc6\x92\x9b\x9a\xcf\x05\x00\x0f\xb2\x02\xe6=\x12?\xde\x1f\x9a=v\x0c3c\xf66\xc6\xcc1y\xe4\xb8\xa0

OUT >>
0030\x01000eunpack ok\n009krf/ed/atr0000

CLOSE CONNECTION
git接收包/home/www/data/project/heyworld/
退出>>
00721ee2436e45c80236878132dc87d9e9fee6a81de5 refs/heads/master\x00报告状态删除refs边带-64k ofs delta\n0000
在>>
00841ee2436e45c80236878132dc87d9e9fee6a81de5 6054B33587BAFD1D96C0FDFBF016D620CCDF09 refs/heads/master\x00报告状态边带-64k0000
在>>
PACK\x00\x00\x00\x02\x00\x00\x00\x00\x03\x96\x0ex\x9c\xa5\x8cM\x0e\xc2\x14\x06\xf7\x9c\x82\x0b\xd8
0030\x01000eunpack正常\n009krf/ed/atr0000
密切联系

您可能知道,这可能是一系列问题

  • 我最初的猜测是,服务器上的某些权限不正确,因此无法更新某些非关键信息
  • 可能还有其他一些问题
几个快速问题/建议:

  • 您能否成功地手动运行该命令
  • 尝试将--verbose标志添加到push命令(即git push--verbose origin/master)

添加verbose标志可能会让您快速找到问题所在。

git邮件列表中一位非常有用的用户采取了他认为是暗中捅了一刀的做法,并正确地解决了问题


我没有返回退出代码,Git在推送时希望返回退出代码。这就解决了问题。

谢谢您的回复。上面的输出实际上已经使用了verbose标志。权限也是我最初的想法之一,但是SSH进程是以root用户身份运行的,所以这真的不是问题所在。我不认为存储库有问题,因为如果我只是将它用作基于文件的源代码,那么处理它(克隆、推送、拉取等)就可以了。不幸的是,Git的verbose标志提供的信息太少,因为它实际上没有告诉您任何有用的信息。