告别手动删库!用Python脚本5分钟清空你的Gitee仓库(附完整代码)
5分钟极速清理Gitee仓库Python自动化脚本实战指南每次登录Gitee看到满屏的废弃测试仓库就头疼手动删除不仅耗时费力还容易误操作。作为开发者我们完全可以用Python脚本将这些重复劳动自动化。本文将带你从零开始手把手实现一个安全高效的Gitee仓库批量清理工具。1. 准备工作与环境配置在开始编写脚本前我们需要完成几项关键准备工作。首先确保你已安装Python 3.6或更高版本这是运行脚本的基础环境。打开终端输入以下命令检查Python版本python --version # 或 python3 --version接下来需要安装requests库它是我们与Gitee API交互的核心工具pip install requests最重要的安全准备是获取Gitee的个人访问令牌(PAT)。这个令牌相当于你的数字身份证必须妥善保管登录Gitee账号点击右上角头像 → 设置 → 私人令牌点击生成新令牌勾选projects权限生成后立即复制保存页面刷新后将无法再次查看安全提示令牌一旦泄露可能造成账号风险建议在脚本使用后及时删除或设置有效期2. 脚本核心代码解析下面是我们实现批量删除功能的核心代码我会逐段解释其工作原理import requests # 配置区 - 使用前必须修改 ACCESS_TOKEN your_personal_access_token # 替换为你的Gitee令牌 USERNAME your_gitee_username # 替换为你的Gitee用户名 API_BASE https://gitee.com/api/v5 # Gitee API基础地址 def get_all_repositories(): 获取用户所有仓库列表 headers { Authorization: ftoken {ACCESS_TOKEN}, Accept: application/json } params { type: all, # 获取所有类型仓库 page: 1, # 页码 per_page: 100 # 每页数量 } repos [] while True: response requests.get( f{API_BASE}/user/repos, headersheaders, paramsparams ) response.raise_for_status() current_page response.json() if not current_page: break repos.extend(current_page) params[page] 1 return repos这段代码定义了获取仓库列表的函数关键点在于使用分页查询确保获取全部仓库raise_for_status()会在API请求失败时抛出异常返回的仓库信息包含name、full_name等关键字段接下来是删除仓库的函数实现def delete_repository(repo_name): 删除指定仓库 headers { Authorization: ftoken {ACCESS_TOKEN}, Accept: application/json } response requests.delete( f{API_BASE}/repos/{USERNAME}/{repo_name}, headersheaders ) if response.status_code 204: print(f✅ 成功删除仓库: {repo_name}) else: print(f❌ 删除失败[{response.status_code}]: {repo_name}) print(f错误信息: {response.text})3. 安全增强与异常处理直接执行删除操作风险较高我们增加以下安全措施模拟运行模式先列出所有仓库而不实际删除白名单过滤保护重要仓库不被误删操作确认需要用户明确确认后才执行删除改进后的主程序逻辑def main(): print( 正在获取仓库列表...) repositories get_all_repositories() if not repositories: print(⚠️ 未找到任何仓库请检查用户名和令牌权限) return print(f 共找到 {len(repositories)} 个仓库) print(\n仓库列表预览) for repo in repositories[:5]: # 只显示前5个作为样例 print(f - {repo[name]} (更新于: {repo[updated_at]})) # 安全确认 confirm input(\n⚠️ 确认要删除以上所有仓库吗(输入y确认): ) if confirm.lower() ! y: print(操作已取消) return # 实际删除操作 print(⏳ 开始删除仓库...) for repo in repositories: delete_repository(repo[name]) print(✨ 所有操作已完成) if __name__ __main__: main()4. 高级功能扩展基础功能实现后我们可以进一步增加实用功能按条件筛选仓库def filter_repositories(repositories, days_old30): 筛选符合条件的仓库 from datetime import datetime, timedelta cutoff_date datetime.now() - timedelta(daysdays_old) return [ repo for repo in repositories if datetime.strptime(repo[updated_at], %Y-%m-%dT%H:%M:%S%z) cutoff_date ]批量转移而非删除def transfer_repository(repo_name, new_owner): 转移仓库所有权 headers { Authorization: ftoken {ACCESS_TOKEN}, Accept: application/json } data { new_owner: new_owner } response requests.post( f{API_BASE}/repos/{USERNAME}/{repo_name}/transfer, headersheaders, jsondata ) return response.status_code 201操作日志记录import csv def log_operation(repo_name, operation, status): 记录操作日志 with open(repo_cleaner_log.csv, a, newline) as f: writer csv.writer(f) writer.writerow([ datetime.now().isoformat(), repo_name, operation, status ])5. 完整脚本与使用示例将上述所有功能整合后的完整脚本如下import requests from datetime import datetime, timedelta import csv import time # 配置区 CONFIG { access_token: your_personal_access_token, username: your_gitee_username, api_base: https://gitee.com/api/v5, dry_run: True, # 模拟运行模式 min_days_old: 30, # 只处理30天未更新的仓库 whitelist: [important-repo] # 白名单仓库 } def get_all_repositories(): 获取用户所有仓库列表 headers {Authorization: ftoken {CONFIG[access_token]}} params {type: all, page: 1, per_page: 100} repos [] while True: try: response requests.get( f{CONFIG[api_base]}/user/repos, headersheaders, paramsparams ) response.raise_for_status() current_page response.json() if not current_page: break repos.extend(current_page) params[page] 1 time.sleep(0.5) # API速率限制 except Exception as e: print(f获取仓库列表出错: {str(e)}) break return repos def filter_repositories(repositories): 筛选符合条件的仓库 cutoff_date datetime.now() - timedelta(daysCONFIG[min_days_old]) filtered [] for repo in repositories: if repo[name] in CONFIG[whitelist]: continue repo_date datetime.strptime(repo[updated_at], %Y-%m-%dT%H:%M:%S%z) if repo_date cutoff_date: filtered.append(repo) return filtered def delete_repository(repo_name): 删除指定仓库 if CONFIG[dry_run]: print(f 模拟删除: {repo_name}) return True headers {Authorization: ftoken {CONFIG[access_token]}} try: response requests.delete( f{CONFIG[api_base]}/repos/{CONFIG[username]}/{repo_name}, headersheaders ) if response.status_code 204: log_operation(repo_name, delete, success) return True else: log_operation(repo_name, delete, ffailed_{response.status_code}) return False except Exception as e: log_operation(repo_name, delete, ferror_{str(e)}) return False def log_operation(repo_name, operation, status): 记录操作日志 with open(repo_cleaner_log.csv, a, newline) as f: writer csv.writer(f) writer.writerow([ datetime.now().isoformat(), repo_name, operation, status ]) def main(): print( 正在获取仓库列表...) all_repos get_all_repositories() if not all_repos: print(⚠️ 未找到任何仓库请检查用户名和令牌权限) return print(f 共找到 {len(all_repos)} 个仓库) filtered_repos filter_repositories(all_repos) print(f 筛选出 {len(filtered_repos)} 个符合条件的仓库) if not filtered_repos: print(没有需要处理的仓库) return print(\n即将处理的仓库样例) for repo in filtered_repos[:5]: print(f - {repo[name]} (最后更新: {repo[updated_at]})) confirm input(\n⚠️ 确认要处理以上所有仓库吗(输入y确认): ) if confirm.lower() ! y: print(操作已取消) return print(⏳ 开始处理仓库...) success_count 0 for repo in filtered_repos: if delete_repository(repo[name]): success_count 1 print(f✨ 处理完成成功操作 {success_count}/{len(filtered_repos)} 个仓库) if CONFIG[dry_run]: print(⚠️ 注意当前为模拟运行模式未实际执行删除操作) if __name__ __main__: main()使用这个脚本时只需修改CONFIG字典中的配置项access_token: 你的Gitee个人访问令牌username: 你的Gitee用户名dry_run: 设为False才会实际执行删除min_days_old: 设置仓库未被更新的最小天数whitelist: 设置不受影响的重要仓库名称列表6. 常见问题与解决方案在实际使用过程中可能会遇到以下典型问题API速率限制Gitee对API调用有频率限制解决方法import time # 在每次API调用后添加延迟 time.sleep(0.5) # 500毫秒SSL证书验证错误如果遇到SSL错误可以临时关闭验证不推荐生产环境使用response requests.get(url, verifyFalse)仓库删除失败的可能原因错误代码可能原因解决方案401令牌无效或过期检查令牌是否有效重新生成403权限不足确保令牌有projects权限404仓库不存在检查仓库名称拼写429请求过于频繁增加请求间隔时间脚本优化建议添加多线程处理加速大批量操作实现仓库备份功能后再删除增加更详细的日志记录支持从配置文件读取设置添加GUI界面简化操作7. 替代方案与工具推荐除了自建脚本还有其他可选方案命令行工具curl方案# 获取仓库列表 curl -H Authorization: token YOUR_TOKEN \ https://gitee.com/api/v5/user/repos?typeallpage1per_page100 # 删除单个仓库 curl -X DELETE -H Authorization: token YOUR_TOKEN \ https://gitee.com/api/v5/repos/USERNAME/REPO_NAME第三方工具对比工具名称优点缺点Gitee官方客户端官方支持界面友好无批量删除功能Postman可视化操作适合测试需要手动配置每个请求GitPython直接操作git仓库无法直接调用Gitee API对于非技术用户可以考虑使用浏览器自动化工具如Selenium来模拟点击操作虽然效率较低但学习成本小。