【问题标题】:Python - Upload files directly to github using PyGithubPython - 使用 PyGithub 将文件直接上传到 github
【发布时间】:2020-08-17 14:25:46
【问题描述】:

我有一个公共存储库,并想使用 python(PyGithub 库)将文件上传到该存储库。

我从SO引用了以下代码:

import base64
from github import Github
from github import InputGitTreeElement

user = "GithubUsername"
password = "*********"
g = Github(user,password)
repo = g.get_user().get_repo('git-test')
file_list = [
    'C:\\Users\jesse\Dropbox\Swell-Forecast\git-test\index.html',
    'C:\\Users\jesse\Dropbox\Swell-Forecast\git-test\margin_table.html'
]

file_names = [
    'index.html',
    'margin_table.html'
]
commit_message = 'python update 2'
master_ref = repo.get_git_ref('heads/master')
master_sha = master_ref.object.sha
base_tree = repo.get_git_tree(master_sha)
element_list = list()
for i, entry in enumerate(file_list):
    with open(entry) as input_file:
        data = input_file.read()
    if entry.endswith('.png'):
        data = base64.b64encode(data)
    element = InputGitTreeElement(file_names[i], '100644', 'blob', data)
    element_list.append(element)
tree = repo.create_git_tree(element_list, base_tree)
parent = repo.get_git_commit(master_sha)
commit = repo.create_git_commit(commit_message, tree, [parent])
master_ref.edit(commit.sha)

但我不想克隆存储库,添加文件然后提交。而是直接上传文件。

有什么方法/示例代码可以直接上传吗?

EG:

当前回购:

file1.txt
file2.txt

上传新文件:

file1.txt
file2.txt
myfolder/
        |_ file3.txt
        |_ file4.txt

【问题讨论】:

  • GitPython 似乎更易于使用:stackoverflow.com/a/39620098/3936044
  • @Mandera GitPython 是 git 的 Python 包装器,而 PyGithub 是 Github API 的包装器。要使用 GitPython 创建提交和推送,必须先克隆,而 OP 希望避免这种情况。

标签: python git github


【解决方案1】:

我为此创建了一小部分代码。它奏效了。在这里分享,让其他人受益。

示例代码:

此代码将上传文件/替换现有文件。

本地文件路径:/tmp/file.txt

Github 文件夹名称:folder1/

from github import Github
g = Github("username", "password")

repo = g.get_user().get_repo(GITHUB_REPO)
all_files = []
contents = repo.get_contents("")
while contents:
    file_content = contents.pop(0)
    if file_content.type == "dir":
        contents.extend(repo.get_contents(file_content.path))
    else:
        file = file_content
        all_files.append(str(file).replace('ContentFile(path="','').replace('")',''))

with open('/tmp/file.txt', 'r') as file:
    content = file.read()

# Upload to github
git_prefix = 'folder1/'
git_file = git_prefix + 'file.txt'
if git_file in all_files:
    contents = repo.get_contents(git_file)
    repo.update_file(contents.path, "committing files", content, contents.sha, branch="master")
    print(git_file + ' UPDATED')
else:
    repo.create_file(git_file, "committing files", content, branch="master")
    print(git_file + ' CREATED')

This question也与此有关。

【讨论】:

    【解决方案2】:

    (注意:未测试)

    我认为您链接的代码可以满足您的需求。

    This gist,用 ruby​​ 编写,显示了一个非常相似的场景,但具有显式命名为每个操作查询的 API 路由的额外好处(create_treecreate_commit,...)

    查看 PyGithub 库的文档:这些方法很可能是相同 API 调用的包装器。

    【讨论】:

      猜你喜欢
      • 2022-10-12
      • 1970-01-01
      • 2020-01-02
      • 2011-06-29
      • 2011-11-02
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 2020-08-01
      相关资源
      最近更新 更多