You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python向空GitHub仓库提交代码遇409错误求助

如何用Python脚本向GitHub空仓库提交初始代码?

我想用Python脚本通过个人GitHub账号向仓库提交代码,已经在Chrome中创建了一个名为test_repo的空仓库,但运行main.py脚本时出现如下错误:

Failed to create commit: 409 {"message":"Git Repository is empty.","documentation_url":"https://docs.github.com/rest/git/commits#create-a-commit"}

我猜测是未创建文件就直接添加内容导致的,但这样需要分两次提交,感觉有些多余。

cryptographer.py是用于安全存储GitHub token的Python文件。

main.py代码如下:

import requests
import cryptographer

def create_commit(repo_owner, repo_name, branch, commit_message, file_changes, access_token, headers):
    # 1. Authentication
    headers['Authorization'] = f'token {access_token}'
    new_repo = repo_is_empty(repo_owner, repo_name, branch, access_token, headers)
    if not new_repo:
        commit_data = {
            'message': commit_message,
            'tree': create_tree(repo_owner, repo_name, file_changes, access_token, headers),
            'parents': [get_latest_commit_sha(repo_owner, repo_name, branch, access_token, headers)]
        }
    else:
        commit_data = {
            'message': commit_message,
            'tree': None  # No need to specify a tree for the initial commit
        }
    # 2. Create a New Commit Object

    response = requests.post(f'https://api.github.com/repos/{repo_owner}/{repo_name}/git/commits', headers=headers, json=commit_data)
    if response.status_code == 201:
        commit_sha = response.json()['sha']
        update_branch_reference(repo_owner, repo_name, branch, commit_sha, access_token, headers)
        print("Commit created successfully!")
    else:
        print("Failed to create commit:", response.status_code, response.text)


def create_tree(repo_owner, repo_name, file_changes, access_token, headers):
    headers['Authorization'] = f'token {access_token}'
    tree_data = []
    for file_change in file_changes:
        tree_data.append({
            'path': file_change['path'],
            'mode': '100644',  # File mode
            'type': 'blob',    # Object type: blob for file
            'content': file_change['content']
        })

    tree_payload = {
        'tree': tree_data
    }

    url = f'https://api.github.com/repos/{repo_owner}/{repo_name}/git/trees'
    response = requests.post(url, headers=headers, json=tree_payload)

    if response.status_code == 201:
        return response.json()['sha']
    else:
        print("Failed to create tree:", response.status_code, response.text)
        return None

def repo_is_empty(repo_owner, repo_name, branch, access_token, headers) -> bool:
    headers['Authorization'] = f'token {access_token}'
    response = requests.get(f'https://api.github.com/repos/{repo_owner}/{repo_name}/git/ref/heads/{branch}', headers=headers)
    if response.status_code == 409:
        return True
    print("Failed to check if repo is empty:", response.status_code, response.text)
    return False

def get_latest_commit_sha(repo_owner, repo_name, branch, access_token, headers):
    headers['Authorization'] = f'token {access_token}'
    response = requests.get(f'https://api.github.com/repos/{repo_owner}/{repo_name}/git/ref/heads/{branch}', headers=headers)
    if response.status_code == 200:
        return response.json()['object']['sha']
    else:
        print("Failed to get latest commit SHA:", response.status_code, response.text)
        return None

def update_branch_reference(repo_owner, repo_name, branch, commit_sha, access_token, headers):
    headers['Authorization'] = f'token {access_token}'
    ref_payload = {
        'sha': commit_sha,
        'force': True
    }

    response = requests.patch(f'https://api.github.com/repos/{repo_owner}/{repo_name}/git/refs/heads/{branch}', headers=headers, json=ref_payload)
    if response.status_code != 200:
        print("Failed to update branch reference:", response.status_code, response.text)

# Example usage
repo_owner: str = REDACTED FOR PRIVACY
repo_name = 'test_repo'
branch = 'main'
commit_message = 'Test commit via Python'
file_changes = [
    {
        'path': 'example.txt',
        'content': 'Hello, world!'
    }
]
access_token = cryptographer.Encrypter.get_token()
headers = {
    'Accept': 'application/vnd.github.v3+json'
}
create_commit(repo_owner, repo_name, branch, commit_message, file_changes, access_token, headers)

我已通过is_valid_username()确认用户存在,且token是几天前生成的(有效期90天),仅知道409错误表示请求因资源当前状态冲突未完成,但不清楚具体原因。

is_valid_username()代码如下:

def is_valid_username(username: str) -> bool:
    url = f"https://api.github.com/users/{username}"
    response = requests.get(url)
    if response.status_code == 200:
        return True
    elif response.status_code == 404:
        return False
    else:
        raise UnknownErrorCodeException(f"Request to find user failed. Github err: {response.status_code}", response.status_code)

恳请各位提供解决建议!

内容的提问来源于stack exchange,提问作者LMcL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:34:55