Skip to content

Instantly share code, notes, and snippets.

@BlueSkyXN
Last active October 5, 2023 07:31
Show Gist options
  • Select an option

  • Save BlueSkyXN/5e6b0ff3fe389cf89b887efe57708341 to your computer and use it in GitHub Desktop.

Select an option

Save BlueSkyXN/5e6b0ff3fe389cf89b887efe57708341 to your computer and use it in GitHub Desktop.
GitLab-DEL.py
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()
@BlueSkyXN
Copy link
Copy Markdown
Author

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()`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment