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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:00:03