使用PyGitHub与PyGit2创建、克隆并推送GitHub仓库
完整流程:用PyGitHub+PyGit2创建仓库并完成克隆/修改/推送
咱先说明白,这俩库的文档确实够让人头疼的,我之前折腾了好一阵才摸清楚完整流程,下面这套步骤亲测可行,一步步来:
1. 前期准备
首先得把依赖装上,还有拿到GitHub的个人访问令牌(PAT):
- 安装库:
pip install PyGitHub pygit2 - 创建GitHub PAT:在GitHub设置里找「Developer settings」→「Personal access tokens」,勾选repo权限(创建仓库、推送都需要这个),生成后保存好,别丢了。
2. 用PyGitHub创建远程仓库
PyGitHub主要用来操作GitHub的API,比如创建仓库、获取仓库信息,代码示例如下:
from github import Github # 替换成你的PAT GITHUB_TOKEN = "your-personal-access-token" # 要创建的仓库名称 REPO_NAME = "test-new-repo" # 初始化GitHub客户端 g = Github(GITHUB_TOKEN) # 获取当前登录用户(也可以指定组织,把g.get_user()换成g.get_org("org-name")) user = g.get_user() # 创建仓库:auto_init=False是关键,避免GitHub自动生成README导致后续克隆冲突 repo = user.create_repo( name=REPO_NAME, private=False, # 按需设为True创建私有仓库 auto_init=False, description="Test repo created via PyGitHub" ) # 拿到仓库的HTTPS克隆地址(如果用SSH的话用repo.ssh_url) clone_url = repo.clone_url # 如果用HTTPS推送,需要把token嵌入URL,避免每次输入密码 clone_url_with_token = clone_url.replace("https://", f"https://{GITHUB_TOKEN}@") print(f"仓库创建成功,克隆地址:{clone_url_with_token}")
3. 用PyGit2克隆仓库到本地
PyGit2是用来操作本地Git仓库的,克隆的时候要处理凭证(credentials),分HTTPS和SSH两种情况:
情况1:HTTPS方式(用PAT)
import pygit2 LOCAL_REPO_PATH = "./test-new-repo" # 克隆仓库,带凭证 repo = pygit2.clone_repository( clone_url_with_token, LOCAL_REPO_PATH, bare=False ) print(f"仓库克隆到本地:{LOCAL_REPO_PATH}")
情况2:SSH方式(用本地SSH密钥)
如果你的机器已经配置了GitHub的SSH密钥,可以这样:
import pygit2 # 创建SSH凭证 credentials = pygit2.KeypairFromAgent("your-github-username") # 克隆时指定凭证 repo = pygit2.clone_repository( repo.ssh_url, LOCAL_REPO_PATH, credentials=credentials, bare=False )
4. 修改本地文件并提交
现在我们在本地仓库里新增一个文件,然后提交:
import os # 新增一个文件 file_path = os.path.join(LOCAL_REPO_PATH, "README.md") with open(file_path, "w") as f: f.write("# Test Repo\nCreated via PyGitHub and PyGit2\n") # 把文件加入暂存区 repo.index.add("README.md") # 提交暂存区的更改:需要设置提交者信息,这里从本地Git配置读取,也可以手动指定 author = pygit2.Signature( repo.config_get_string("user.name"), repo.config_get_string("user.email") ) committer = author # 这里提交者和作者设为同一个,按需修改 # 提交 commit_hash = repo.index.commit( "Initial commit: add README.md", author=author, committer=committer ) print(f"提交成功,哈希值:{commit_hash}")
5. 推送到远程GitHub仓库
最后一步把本地提交推送到远程,同样要处理凭证:
HTTPS方式
# 获取远程仓库(默认是origin) remote = repo.remotes["origin"] # 推送:推送main分支(现在GitHub默认分支是main,不是master了,注意对应) remote.push( ["refs/heads/main"], # HTTPS的话,凭证可以直接用之前的token,这里创建UsernamePasswordCredentials credentials=pygit2.UsernamePasswordCredentials(GITHUB_TOKEN, "") ) print("推送成功到远程仓库!")
SSH方式
remote = repo.remotes["origin"] remote.push( ["refs/heads/main"], credentials=pygit2.KeypairFromAgent("your-github-username") ) print("推送成功到远程仓库!")
一些踩过的坑要注意
- 分支名称:现在GitHub默认分支是
main,不是以前的master,别写错了,不然会推送失败。 - auto_init=False:创建仓库时一定要设这个,不然GitHub会自动生成README和.gitignore,导致你克隆后本地是空的,推送时会有冲突。
- PAT权限:一定要勾选
repo权限,不然创建仓库或者推送时会报403权限错误。 - pygit2的签名:提交时必须设置author和committer,不然会报错,最好提前在本地Git配置好user.name和user.email,这样代码里直接读取就行。
内容的提问来源于stack exchange,提问作者Bar Smith
相关产品推荐
相关产品推荐

