智能HTTP git客户端

时间:2017-03-02 22:28:09

标签: git

在这里,这部分我无法使其发挥作用。

ifor_ combinator

# -*- coding: utf-8 -*-
import requests                              
url = "https://github.com/llacroix/node-nfc.git/git-upload-pack"

def make_line(line):
    prefix = "%0.4x" % (len(line) + 4)
    return "%s%s" % (prefix, line)

data = ""
data += make_line("want ba9007f12771f6fddf2b1b22888af90352588197\0 \n")
data += make_line("have 5cec4d0c777aa2bda27c6c9be8e6108ef0f08d62\n")
data += "0000"

req = requests.post(url, data, headers={'Content-Type': 'application/x-git-upload-pack-request'})
print req.text

我不明白我是如何让它发挥作用的。我在本地尝试了以下命令:

git-upload-pack --stateless-rpc .

但我无法弄清楚协议是否正常工作。它要么失败要么在本地没有返回。而且远程地,它始终失败:

  

IncompleteRead(0字节读取)',...

1 个答案:

答案 0 :(得分:0)

好的,首先解决问题的方法基于这个类似问题的答案。

https://stackoverflow.com/a/31953327/54606

我链接的文档错误或过时。 NUL分隔符不是" \ 0"但是" 0000"。 " 0000"实际上并没有结束沟通,而是“完成了”#34;实际上是这样做的。

该行前面的四个字符实际上是包含换行符的行的长度,除了0000之外的4个字符是从它们开始的行。不看源代码,我期待" 0000"表现得像重置或冲洗。

完成的行也必须以9个字符为前缀,包括换行符。

最终结果如下:

upload_pack = '%s/git-upload-pack'
url = upload_pack % (options.url)

def make_line(line):
    prefix = "%0.4x" % (len(line) + 5)
    return "%s%s\n" % (prefix, line)

def make_want(obj):
    line = make_line("want %s" % obj)
    return line + "0000"

def make_have(obj):
    return make_line("have %s" % obj)

def make_request(from_obj, to_obj):
    data = ""
    data += make_want(to_obj)
    data += make_have(from_obj)
    data += make_line("done")
    return data

headers = {
    'Content-Type': 'application/x-git-upload-pack-request',
}

req_data = make_request(options.from_obj, options.to_obj)
req = requests.post(url, req_data, headers=headers)

print req.content