Skip to content

Instantly share code, notes, and snippets.

@Yiannistaos
Created November 3, 2024 13:48
Show Gist options
  • Select an option

  • Save Yiannistaos/e5b5a3d73b8ce0abc489a9874dad971e to your computer and use it in GitHub Desktop.

Select an option

Save Yiannistaos/e5b5a3d73b8ce0abc489a9874dad971e to your computer and use it in GitHub Desktop.
Delete all releases and tags from a GitHub repository
import requests
import os
from typing import Optional
class GitHubCleaner:
def __init__(self, token: str, org: str, repo: str):
"""
Initialize with GitHub personal access token, organization name, and repository name.
"""
self.base_url = "https://api.github.com"
self.headers = {
"Authorization": f"token {token}",
"Accept": "application/vnd.github.v3+json"
}
self.org = org
self.repo = repo
def delete_all_releases(self) -> None:
"""Delete all releases from the repository."""
url = f"{self.base_url}/repos/{self.org}/{self.repo}/releases"
while True:
response = requests.get(url, headers=self.headers)
releases = response.json()
if not releases:
break
for release in releases:
release_id = release['id']
delete_url = f"{self.base_url}/repos/{self.org}/{self.repo}/releases/{release_id}"
requests.delete(delete_url, headers=self.headers)
print(f"Deleted release: {release['tag_name']}")
def delete_all_tags(self) -> None:
"""Delete all tags from the repository."""
url = f"{self.base_url}/repos/{self.org}/{self.repo}/git/refs/tags"
response = requests.get(url, headers=self.headers)
tags = response.json()
for tag in tags:
tag_name = tag['ref'].split('/')[-1]
delete_url = f"{self.base_url}/repos/{self.org}/{self.repo}/git/refs/tags/{tag_name}"
requests.delete(delete_url, headers=self.headers)
print(f"Deleted tag: {tag_name}")
def main():
# Get environment variables or prompt for input
token = os.getenv("GITHUB_TOKEN") or input("Enter your GitHub personal access token: ")
org = input("Enter organization name: ")
repo = input("Enter repository name: ")
cleaner = GitHubCleaner(token, org, repo)
# Confirm before proceeding
confirm = input(f"Are you sure you want to delete ALL releases and tags from {org}/{repo}? (yes/no): ")
if confirm.lower() != 'yes':
print("Operation cancelled.")
return
try:
print("Deleting releases...")
cleaner.delete_all_releases()
print("Deleting tags...")
cleaner.delete_all_tags()
print("Cleanup completed successfully!")
except Exception as e:
print(f"An error occurred: {str(e)}")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment