使用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
相关产品推荐
相关产品推荐

