2017-03-02 135 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