2017-03-02 108 views
1

在这里,这部分我不能使它工作。智能HTTP git客户端

https://gist.github.com/schacon/6092633#file-git-http-proto-txt-L313

# -*- 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字节读)”,......

+0

你到底想干什么?你有没有考虑过使用[libgit2](https://libgit2.github.com/)? – Schwern

+0

我试图使用并行互联网连接异步获取多个包。 –

+0

如果你能找到一个使用http(不是https)的Git仓库,你可以用'tcpdump -A -i <网络接口>主机和tcp端口80'来嗅探git fetch正在做什么。 – Schwern

回答

0

好了,第一关的解决方案是相当多基于这个答案类似的问题。

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

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

行之前的四个字符实际上是行的长度,包括一个换行符,除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