Python 如何使用GitHub API v3创建提交并推入到repo中?

Python 如何使用GitHub API v3创建提交并推入到repo中?,python,github,github-api,Python,Github,Github Api,我想创建一个存储库,并通过任何Python包向其提交一些文件。我该怎么办 我不知道如何添加提交文件。Github提供了一个可供您读取和写入原始对象以及列出和更新引用(分支头和标记)的工具。为了更好地理解这个主题,我强烈建议您阅读ProGit书籍的一章 根据文档,将更改提交到存储库中的文件需要7个步骤: 获取当前提交对象 检索它指向的树 检索树针对特定文件路径具有的blob对象的内容 以某种方式更改内容,并发布带有该新内容的新blob对象,以获取blob SHA 发布一个新的树对象,并将该文件路径

我想创建一个存储库,并通过任何Python包向其提交一些文件。我该怎么办

我不知道如何添加提交文件。

Github提供了一个可供您读取和写入原始对象以及列出和更新引用(分支头和标记)的工具。为了更好地理解这个主题,我强烈建议您阅读ProGit书籍的一章

根据文档,将更改提交到存储库中的文件需要7个步骤:

  • 获取当前提交对象
  • 检索它指向的树
  • 检索树针对特定文件路径具有的blob对象的内容
  • 以某种方式更改内容,并发布带有该新内容的新blob对象,以获取blob SHA
  • 发布一个新的树对象,并将该文件路径指针替换为新的blob SHA,以恢复树SHA
  • 创建一个新的commit对象,当前commit SHA作为父对象,新的树SHA将返回commit SHA
  • 更新分支的引用以指向新的提交SHA

  • 在使用perl解释这个过程方面做得很好。对于python实现,您可以使用库。

    您可以查看新的更新是否有帮助

    已允许读取文件一段时间。现在,您可以轻松地将更改提交到单个文件,就像在web UI中一样

    从今天开始,您可以使用以下方法:

    在python旁边,我可以创建一个新文件,它甚至可以通过提交和推送到我在GitHub中的repo中,再加上php、java和go

    通过检查和查看一些可用的第三方软件,如perl中提供的,我建议使用以下软件:

    • (python)
    • (菲律宾)
    • (爪哇)
    • (去)
    正如您所知,每个GitHub帐户和组织可以获得一个站点,并且可以获得无限的项目站点,其中这些站点直接由您的回购托管,默认情况下由您提供支持

    结合,和GAE上的GitHub API脚本,以及适当的,它将为您提供一个广泛的可能性,比如在GitHub上创建一个动态页面


    除了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