2016-10-05 34 views
0

我想用Github API更新文件并将其提交到分支中。我有麻烦创建提交。 SHA与预期的不符。如何用Python中的Github api字符串计算SHA?

{ 
    'documentation_url': 'https://developer.github.com/enterprise/2.7/v3/repos/contents/', 
    'message': 'pom.xml does not match de42fdd980f9b8067a2af982de46b8d5547e4597' 
} 

我做了以下内容:

import hashlib 
myfile = "new content of my README" 
resulting_file = base64.b64encode(bytes(myfile, "utf-8")) 
file_as_str = str(resulting_file.decode('utf-8')) 
sha = hashlib.sha1(file_as_str.encode('utf-8')).hexdigest() 

url = 'https://someurl.com/someproject/contents/README.md?access_token=' + access_token 
data = '{"message": "bla bla", "content": "'+file_as_str+'", "sha": "'+sha+'", "branch": "'+branch+'"}' 
response = requests.put(url, data=data) 

我不喜欢用一个lib这样做是为了更好地了解发生了什么。可能SHA没有正确生成,但我无法确定原因。有人可以帮忙吗?

+0

你确定你需要校验base64编码的文件版本? –

回答

2

你并不需要计算SHA新文件。相反,您必须提供替换为的文件的SHA。您可以获取使用requests.get()执行的文件get contents

url = 'https://api.github.com/repos/someowner/someproject/contents/pom.xml' 
r = requests.get(url) 
sha = r.json()['sha'] 

然后使用sha值在PUT申请更新文件:

with open('myfile', 'rb') as f: 
    content = str(base64.b64encode(f.read()), encoding='utf8') 
    data = {'message': 'bla bla', 'content': content, 'sha': sha, 'branch': branch} 
    r = requests.put(url, json=data) 
+0

Thx,为答案。现在我对api有两种不同的解释。他们似乎都没有工作。当我按照您的要求获取SHA时,仍然会出现错误。 –

+0

使用通过文件内容API抓取SHA时需要注意的一件事是,该API仅适用于大小不超过1 MB的文件,因此如果文件大于该文件将会失败。我期望原始问题中的'pom.xml'小于此值,但是推广到其他文件可能会有问题。 – kfb

+0

@PaulFournel:你得到什么错误?我可以向你保证,你必须使用被替换的文件的内容,而不是新内容的内容。我没有显示它,但是你还需要在'put'请求中添加认证 - 无论是HTTP头还是查询字符串。 – mhawke

0

GitHub上计算哈希值作为followes:

sha1("blob " + filesize + "\0" + data) 

所以使用此代码:

with open(filepath, 'rb') as file_for_hash: 
    data = file_for_hash.read() 
    filesize = len(data) 
sha = hashlib.sha1("blob " + filesize + "\0" + data).hexdigest()