Python -使用PyGithub将文件直接上传到github

yrdbyhpb  于 2022-12-10  发布在  Git
关注(0)|答案(3)|浏览(173)

我有一个公共存储库,想用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)

但是我不想克隆repo,添加文件然后提交,而是直接上传文件。
是否有任何方法/示例代码可用于直接上传?

例如:

当前回购:

file1.txt
file2.txt

上传新文件:

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

tv6aics11#

我已经为此创建了一个小的代码集。它的工作。分享它在这里,所以其他人可以从中受益。

示例代码:

此代码将上载文件/替换现有文件。
本地文件路径:/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也与此相关。

cgvd09ve

cgvd09ve2#

(note:未测试)
我认为你链接的代码能达到你的目的。
用ruby编写的This gist显示了一个非常类似的场景,但它具有显式命名为每个操作查询的API路由的额外优势(create_treecreate_commit ...)
查看PyGithub库的文档:这些方法很可能是相同API调用的 Package 器。

thtygnil

thtygnil3#

from github import Github

ACCESS_TOKEN = ""
GITHUB_REPO = "data_store"
GIT_BRANCH = "main"
INTERNAL_FILE = "local/data/folder/file1.csv"
FOLDER_EMPL_IN_GIT = "serialized/file.txt"

def add_or_update_in_git(access_tocken, github_repo, git_branch, initial_file, folder_empl_in_git):
    g = Github(access_tocken)

    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(initial_file, 'r') as file:
        content = file.read()

    # Upload to github
    if folder_empl_in_git in all_files:
        contents = repo.get_contents(folder_empl_in_git)
        repo.update_file(contents.path, "committing files", content, contents.sha, branch=git_branch)
        return folder_empl_in_git + ' UPDATED'
    else:
        repo.create_file(folder_empl_in_git, "committing files", content, branch=git_branch)
        return folder_empl_in_git + ' CREATED'

add_or_update_in_git(ACCESS_TOKEN, GITHUB_REPO, GIT_BRANCH, INTERNAL_FILE, FOLDER_EMPL_IN_GIT)

相关问题