Last active
January 10, 2023 19:30
-
-
Save diflores/51244763a514212d9526709ff099ef9d to your computer and use it in GitHub Desktop.
Bulk delete GitHub repositories
This file contains 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
""" | |
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