告别手动!用Python脚本5分钟清空你的Gitee仓库(附完整代码)

告别手动!用Python脚本5分钟清空你的Gitee仓库(附完整代码)

5分钟极速清理Gitee仓库:Python自动化脚本实战指南

每次登录Gitee看到满屏的废弃测试仓库就头疼?手动一个个删除不仅耗时费力,还容易误删重要项目。作为经历过这种痛苦的开发者,我花了三个周末研究Gitee API,最终打磨出这个开箱即用的Python解决方案。本文将带你从零开始,用不到50行代码实现批量删除的自动化流程。

1. 环境准备与权限配置

在开始编写脚本前,我们需要确保开发环境就绪。不同于简单的爬虫脚本,与Gitee API交互需要特别注意身份验证和请求频率限制。

基础环境要求:

  • Python 3.6+(推荐3.8+以获得最佳稳定性)
  • requests库(处理HTTP请求)
  • 有效的Gitee账号

安装依赖只需一行命令:

pip install requests

提示:建议使用虚拟环境隔离项目依赖,避免与其他Python项目产生冲突

获取API访问令牌是关键步骤:

  1. 登录Gitee官网,进入"设置"→"私人令牌"
  2. 点击"生成新令牌",勾选projects权限范围
  3. 安全保存生成的token字符串(页面关闭后将无法再次查看完整token)

常见权限问题排查:

错误代码可能原因解决方案
401Token无效或过期重新生成token
403权限不足检查token权限范围
429请求频率过高添加延时或分批处理

2. 核心脚本逐行解析

下面是我们将要使用的完整脚本框架,每个函数都设计为可独立测试的模块:

import requests import time # 配置区 ACCESS_TOKEN = "your_personal_token_here" # 替换为你的实际token USERNAME = "your_gitee_username" # 替换为你的Gitee用户名 API_DELAY = 1.0 # API调用间隔(秒),避免触发限流 def fetch_all_repos(): """获取用户所有仓库列表""" headers = {"Authorization": f"token {ACCESS_TOKEN}"} url = f"https://gitee.com/api/v5/users/{USERNAME}/repos" try: response = requests.get(url, headers=headers) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f"获取仓库列表失败: {str(e)}") return None def delete_single_repo(repo_name): """删除指定仓库""" headers = {"Authorization": f"token {ACCESS_TOKEN}"} url = f"https://gitee.com/api/v5/repos/{USERNAME}/{repo_name}" try: response = requests.delete(url, headers=headers) if response.status_code == 204: print(f"✅ 成功删除: {repo_name}") else: print(f"❌ 删除失败[{response.status_code}]: {repo_name}") except Exception as e: print(f"⚠️ 删除异常: {repo_name} - {str(e)}") if __name__ == "__main__": repositories = fetch_all_repos() if not repositories: print("无法获取仓库列表,请检查配置") exit(1) print(f"共发现 {len(repositories)} 个仓库,开始清理...") for repo in repositories: delete_single_repo(repo["name"]) time.sleep(API_DELAY) # 遵守API速率限制 print("仓库清理任务完成!")

关键改进点说明:

  1. 增加了异常处理机制,避免单个请求失败导致整个脚本中断
  2. 引入API调用间隔,防止触发Gitee的速率限制(默认1秒/次)
  3. 使用更直观的表情符号标记操作结果,提升终端输出可读性
  4. 将配置参数提取到脚本顶部,方便快速修改

3. 高级功能扩展

基础脚本已经能解决80%的使用场景,但对于特殊需求,我们可以进一步扩展:

选择性删除功能

# 在delete_single_repo调用前添加过滤条件 for repo in repositories: if "test" in repo["name"].lower(): # 只删除包含test的仓库 delete_single_repo(repo["name"]) time.sleep(API_DELAY)

批量归档替代删除

def archive_repo(repo_name): """归档仓库(设为只读)""" headers = {"Authorization": f"token {ACCESS_TOKEN}"} url = f"https://gitee.com/api/v5/repos/{USERNAME}/{repo_name}" data = {"archived": True} response = requests.patch(url, headers=headers, json=data) if response.status_code == 200: print(f"已归档: {repo_name}")

多账户批量处理

ACCOUNTS = [ {"token": "token1", "username": "user1"}, {"token": "token2", "username": "user2"} ] for account in ACCOUNTS: ACCESS_TOKEN = account["token"] USERNAME = account["username"] # 执行清理逻辑...

4. 实战中的避坑指南

在实际使用过程中,我总结了以下几个常见问题及解决方案:

API限流应对策略

  • Gitee API默认限制为每小时1000次请求
  • 重要操作建议添加重试机制:
from tenacity import retry, stop_after_attempt, wait_fixed @retry(stop=stop_after_attempt(3), wait=wait_fixed(2)) def safe_delete_repo(repo_name): delete_single_repo(repo_name)

仓库删除不可逆

  • 建议先运行模拟模式确认要删除的仓库:
def dry_run(): repos = fetch_all_repos() print("以下仓库将被删除:") for repo in repos: print(f"- {repo['name']}") confirm = input("确认删除?(y/n): ") return confirm.lower() == 'y'

网络不稳定处理

  • 添加超时设置避免长时间挂起:
response = requests.get(url, headers=headers, timeout=10)

日志记录最佳实践

  • 将操作记录保存到文件:
import logging logging.basicConfig( filename='gitee_cleaner.log', level=logging.INFO, format='%(asctime)s - %(message)s' ) def delete_single_repo(repo_name): try: # ...原有逻辑... logging.info(f"Deleted: {repo_name}") except Exception as e: logging.error(f"Fail to delete {repo_name}: {str(e)}")

5. 企业级应用场景

这套脚本不仅适用于个人账户清理,经过适当改造后还能应用于:

CI/CD流水线集成

  • 在自动化测试结束后清理临时仓库
  • 与Jenkins/GitLab CI等工具结合使用
# Jenkins集成示例 import os def get_env_vars(): return { "token": os.getenv("GITEE_TOKEN"), "username": os.getenv("GITEE_USER") }

多团队协作管理

  • 定期清理过期项目
  • 配合数据库记录操作历史
import sqlite3 def init_db(): conn = sqlite3.connect('cleaner.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS operations (id INTEGER PRIMARY KEY, repo_name TEXT, action TEXT, timestamp DATETIME)''') conn.commit() return conn

教育机构应用

  • 学期结束时批量清理学生实验仓库
  • 配合白名单机制保护重要项目
PROTECTED_REPOS = ["final-project", "thesis"] for repo in repositories: if repo["name"] not in PROTECTED_REPOS: delete_single_repo(repo["name"])

这个脚本在我的团队已经稳定运行半年多,累计清理了2000+个废弃仓库。最惊喜的是有位同事将其改造成了定时任务,每周自动归档超过一个月未更新的测试项目。如果你在使用的过程中有任何改进建议,欢迎在评论区分享你的实战经验。