Skip to content

Instantly share code, notes, and snippets.

@cassc
Last active May 10, 2023 07:10
Show Gist options
  • Save cassc/b0260ee0b92db6175a776a8eeee596ed to your computer and use it in GitHub Desktop.
Save cassc/b0260ee0b92db6175a776a8eeee596ed to your computer and use it in GitHub Desktop.
Clone all of your github repos
#!/usr/bin/python
# Clone all repos from github.
# Usage:
# python3 github.py -t [GITHUB_TOKEN] -o [OUTPUT_DIR] -k [PROJECT_OWNER]
from requests.auth import HTTPBasicAuth
import requests
import os
repos = set()
def owner_by_ssh_url(url):
return url.split(':')[1].split('/')[0]
def load_repos(token, page=1, keeper=None):
per_page = 100
url = f'https://api.github.com/user/repos?page={page}&per_page={per_page}'
headers = {'Authorization': f'token {token}'}
resp = requests.get(url, headers=headers)
if resp.status_code != 200:
print('get repos failed')
os._exit(1)
rs = resp.json()
for r in rs:
name = r['name']
url = r['ssh_url']
if keeper is None or keeper == owner_by_ssh_url(url):
repos.add((name, url))
if len(rs) == per_page:
load_repos(token, page+1, keeper)
# load all repos and save in `repos`
def load_all_repos(token, keeper=None):
load_repos(token, 1, keeper)
def download_repo(shallow, output, name, href):
print(f'Cloning {name} {href}')
depth = '' if not shallow else '--depth=1'
os.system(f'git clone {depth} {href} "{output}/{name}"')
if __name__ == "__main__":
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-t", "--token", help="Github developer token", type=str, required=True)
ap.add_argument("-o", "--output", help="Output directory", type=str, required=True)
ap.add_argument("-k", "--keeper", help="Only clone repos by this owner", type=str, required=False)
ap.add_argument("--shallow", help="Only clone head commit of each repository", action='store_true')
args = vars(ap.parse_args())
token = args['token']
output = args['output']
keeper = args['keeper']
shallow = args['shallow']
load_all_repos(token, keeper)
for repo in repos:
download_repo(shallow, output, *repo)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment