Python 如何使用GitHub API v3创建提交并推入到repo中?
我想创建一个存储库,并通过任何Python包向其提交一些文件。我该怎么办 我不知道如何添加提交文件。Github提供了一个可供您读取和写入原始对象以及列出和更新引用(分支头和标记)的工具。为了更好地理解这个主题,我强烈建议您阅读ProGit书籍的一章 根据文档,将更改提交到存储库中的文件需要7个步骤:Python 如何使用GitHub API v3创建提交并推入到repo中?,python,github,github-api,Python,Github,Github Api,我想创建一个存储库,并通过任何Python包向其提交一些文件。我该怎么办 我不知道如何添加提交文件。Github提供了一个可供您读取和写入原始对象以及列出和更新引用(分支头和标记)的工具。为了更好地理解这个主题,我强烈建议您阅读ProGit书籍的一章 根据文档,将更改提交到存储库中的文件需要7个步骤: 获取当前提交对象 检索它指向的树 检索树针对特定文件路径具有的blob对象的内容 以某种方式更改内容,并发布带有该新内容的新blob对象,以获取blob SHA 发布一个新的树对象,并将该文件路径
在使用perl解释这个过程方面做得很好。对于python实现,您可以使用库。您可以查看新的更新是否有帮助 已允许读取文件一段时间。现在,您可以轻松地将更改提交到单个文件,就像在web UI中一样 从今天开始,您可以使用以下方法:
- (python)
- (菲律宾)
- (爪哇)
- (去)
除了GAE,还有一个在Heroku上运行它的选项。使用位于(免费)Heroku实例上的,为每篇文章生成JSON文件,并将更改推回到GitHub。以下是完整的代码片段:
def push_to_github(filename, repo, branch, token):
url="https://api.github.com/repos/"+repo+"/contents/"+filename
base64content=base64.b64encode(open(filename,"rb").read())
data = requests.get(url+'?ref='+branch, headers = {"Authorization": "token "+token}).json()
sha = data['sha']
if base64content.decode('utf-8')+"\n" != data['content']:
message = json.dumps({"message":"update",
"branch": branch,
"content": base64content.decode("utf-8") ,
"sha": sha
})
resp=requests.put(url, data = message, headers = {"Content-Type": "application/json", "Authorization": "token "+token})
print(resp)
else:
print("nothing to update")
token = "lskdlfszezeirzoherkzjehrkzjrzerzer"
filename="foo.txt"
repo = "you/test"
branch="master"
push_to_github(filename, repo, branch, token)
使用请求库的解决方案:
注意:我使用该库调用GitHub REST API v3
1。获取特定分支的最后一个提交SHA
#GET/repos/:owner/:repo/branchs/:branch\u name
last_commit_sha=response.json()['commit']['sha']
2。使用文件内容(编码base64或utf-8)创建blob
#POST/repos/:owner/:repo/git/blobs
# {
#“内容”:“aGVsbG8gd29ybGQK”,
#“编码”:“base64”
#}
base64\u blob\u sha=response.json()['sha']
#POST/repos/:owner/:repo/git/blobs
# {
#“内容”:“你好,世界”,
#“编码”:“utf-8”
#}
utf8\u blob\u sha=response.json()['sha']
3。创建定义文件夹结构的树
#回购后/:所有者/:回购/git/trees/
# {
#“基础树”:最后一次提交,
#“树”:[
# {
#“路径”:“myfolder/base64file.txt”,
#“模式”:“100644”,
#“类型”:“blob”,
#“sha”:base64_blob_sha
# },
# {
#“路径”:“file-utf8.txt”,
#“模式”:“100644”,
#“类型”:“blob”,
#“sha”:utf8\u blob\u sha
# }
# ]
# }
tree_sha=response.json()['sha']
4。创建提交
#POST/repos/:owner/:repo/git/commits
# {
#“消息”:“以编程方式立即添加新文件”,
#“作者”:{
#“姓名”:“简·迈克尔·文森特”,
#“电子邮件”:JanQuadrantVincent16@rickandmorty.com"
# },
#“父母”:[
#最后的承诺
# ],
#"树":树沙
# }
new_commit_sha=response.json()['sha']
5。更新分支的引用以指向新的提交SHA(在主分支示例中)
#POST/repos/:owner/:repo/git/refs/heads/master
# {
#“ref”:“refs/heads/master”,
#“sha”:新提交的sha
# }
最后,要了解更高级的设置,请阅读。根据前面的答案,这里是一个完整的示例。请注意,如果将提交上载到新分支,则需要使用
POST
,或者使用PATCH
上载到现有分支
进口需要的东西
GITHUB_TOKEN=“将要发生什么”
def github_请求(方法、url、标题=None、数据=None、参数=None):
“”“执行对GitHUB API的请求,处理重定向”“”
如果不是标题:
标题={}
headers.update({
“用户代理”:“代理007”,
“授权”:“持票人”+GITHUB_代币,
})
url_parsed=urllib.parse.urlparse(url)
url\u path=url\u解析的路径
如果参数为:
url_path+=“?”+urllib.parse.urlencode(参数)
data=data和json.dumps(数据)
conn=http.client.HTTPSConnection(url\u parsed.hostname)
conn.request(方法,url\u路径,body=data,headers=headers)
response=conn.getresponse()
如果response.status==302:
返回github_请求(方法、响应.头[“位置”])
如果response.status>=400:
headers.pop('Authorization',None)
引发异常(
f“错误:{response.status}-{json.loads(response.read())}-{method}-{url}-{data}-{headers}”
)
返回(response,json.load(response.read().decode()))
def上传到github(存储库、src、dst、作者姓名、作者电子邮件、git消息、branch=“heads/master”):
#获取分支的最后一个分支
resp,jeez=githu