Last active
October 5, 2023 07:31
-
-
Save BlueSkyXN/5e6b0ff3fe389cf89b887efe57708341 to your computer and use it in GitHub Desktop.
GitLab-DEL.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import requests | |
| # Author @BlueSkyXN | |
| # License @GPLv3 | |
| # 功能:通过HTTP API操作,实现清空所有Gitlab仓库。由于一次只能读取100个仓库,所以本脚本一次只能删除100个仓库,重复运行即可。后续可重新从GitHub等平台导入,避免数据不一致的问题。 | |
| # 效果示例图: https://telegraph.cachefly.net/file/e5f167d14ac8e10df7e8c.png | |
| # 设置 GitLab 实例 URL 和访问令牌 | |
| GITLAB_URL = 'https://gitlab.com' #官方版gitlab | |
| ACCESS_TOKEN = 'XXXXX' # 在 https://gitlab.com/-/profile/personal_access_tokens 处新建token,权限拉满,有效期记得短一点 | |
| USER_ID = 'ID_USERNAME' # 替换为你的GitLab用户ID,用户名,等于 https://gitlab.com/BlueSkyXN 这样的名字。 | |
| headers = { | |
| 'Private-Token': ACCESS_TOKEN, | |
| } | |
| def get_all_projects(page=1): | |
| response = requests.get(f'{GITLAB_URL}/api/v4/users/{USER_ID}/projects?per_page=100&page={page}', headers=headers) | |
| if response.status_code != 200: | |
| print(f'Failed to retrieve projects: {response.content}') | |
| return [] | |
| return response.json() | |
| def delete_project(project_id): | |
| response = requests.delete(f'{GITLAB_URL}/api/v4/projects/{project_id}', headers=headers) | |
| if response.status_code != 202: | |
| print(f'Failed to delete project {project_id}: {response.content}') | |
| def main(): | |
| page = 1 | |
| while True: | |
| projects = get_all_projects(page) | |
| if not projects: | |
| break | |
| for project in projects: | |
| print(f'Deleting project {project["id"]}: {project["name"]}') | |
| delete_project(project['id']) | |
| page += 1 | |
| if __name__ == '__main__': | |
| main() |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
GitLab API的分页限制是每页最多100个项目。
为了获取并删除所有的仓库,需要遍历所有的分页。
脚本已经包含了这个逻辑,它通过增加page变量的值来获取下一页的仓库,直到没有更多的仓库为止。
如果想加速删除过程,你可能需要考虑并发删除仓库。
可以使用Python的concurrent.futures模块来实现并发删除。
下面是一个示例,展示了如何使用ThreadPoolExecutor来并发删除仓库:
`import requests
from concurrent.futures import ThreadPoolExecutor
GITLAB_URL = 'https://gitlab.com'
ACCESS_TOKEN = 'TOKEN'
USER_ID = 'id'
headers = {
'Private-Token': ACCESS_TOKEN,
}
def get_all_projects(page=1):
response = requests.get(f'{GITLAB_URL}/api/v4/users/{USER_ID}/projects?per_page=100&page={page}', headers=headers)
if response.status_code != 200:
print(f'Failed to retrieve projects: {response.content}')
return []
return response.json()
def delete_project(project_id):
response = requests.delete(f'{GITLAB_URL}/api/v4/projects/{project_id}', headers=headers)
if response.status_code != 202:
print(f'Failed to delete project {project_id}: {response.content}')
else:
print(f'Successfully deleted project {project_id}')
def main():
page = 1
with ThreadPoolExecutor() as executor:
while True:
projects = get_all_projects(page)
if not projects:
break
# 并发删除当前页的所有仓库
executor.map(delete_project, [project['id'] for project in projects])
page += 1
if name == 'main':
main()`