Skip to content

Instantly share code, notes, and snippets.

@diflores
Last active January 10, 2023 19:30
Show Gist options
  • Save diflores/51244763a514212d9526709ff099ef9d to your computer and use it in GitHub Desktop.
Save diflores/51244763a514212d9526709ff099ef9d to your computer and use it in GitHub Desktop.
Bulk delete GitHub repositories
"""
The following script is a dead-simple one to bulk delete repositories at a GitHub organization.
Note:
You will need to put your GitHub Token (you can generate one here:
https://github.com/settings/tokens) in a .env file located in the same directory
as this script. When generating your token, make sure you selected all the scopes
related to private repositories and deleting them.
"""
import json
import os
import requests
from dotenv import load_dotenv
# Loads GitHub token as environment variable.
load_dotenv()
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
GITHUB_API_BASE_URL = "https://api.github.com"
# Name of the GitHub organization where you want to bulk delete repositories.
ORGANIZATION_NAME = ""
def filter_repositories(name):
"""Checks if given repository name meets condition to be deleted. Feel free to edit this function to
suit your own needs.
Arguments:
name {str} -- Repository name
Returns:
bool -- True if repository has to be deleted, False if not.
"""
return name.startswith("sample-name") or name.startswith("sample-name-1")
def list_organization_repositories():
"""Lists repositories that meet the condition to be deleted.
Returns:
list -- List of repository names.
"""
# We only want to delete private repositories. Feel free to edit visibility
# according to GitHub API V3 documentation.
payload = {
"visibility": "private",
"access_token": GITHUB_TOKEN,
"per_page": 100,
}
next_page = True
request_url = f"{GITHUB_API_BASE_URL}/orgs/{ORGANIZATION_NAME}/repos"
repository_names = []
while next_page:
response = requests.get(request_url, params=payload)
json_response = json.loads(response.text)
filtered_repositories = [x["name"]
for x in json_response if filter_repositories(x["name"])]
repository_names.extend(filtered_repositories)
if "next" in response.links:
request_url = response.links["next"]["url"]
else:
next_page = False
return repository_names
def delete_repositories(repositories_list):
"""Deletes repositories in given list.
Arguments:
repositories_list {list} -- List of repository names that are going to be deleted.
"""
for repo_name in repositories_list:
payload = {
"access_token": GITHUB_TOKEN,
}
delete_url = f"{GITHUB_API_BASE_URL}/repos/{ORGANIZATION_NAME}/{repo_name}"
requests.delete(delete_url, params=payload)
print("All repositories in list were successfully deleted.")
if __name__ == "__main__":
repos = list_organization_repositories()
delete_repositories(repos)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment