Skip to content


Repository files navigation


It's a script to clone/update all repos for a user/organization from GitHub.

Target audience: maintainers of large collections of projects (for example, ZopeFoundation members).

Usage examples

First pip install ghcloneall.

Clone all mgedmin's vim plugins:

mkdir ~/src/vim-plugins
cd ~/src/vim-plugins
ghcloneall --init --user mgedmin --pattern '*.vim'

Clone all mgedmin's gists:

mkdir ~/src/gists
cd ~/src/gists
ghcloneall --init --user mgedmin --gists

Clone all ZopeFoundation repositories:

mkdir ~/src/zf
cd ~/src/zf
ghcloneall --init --org ZopeFoundation

Here's a screencast of the above (running a slightly older version so the script name differs):



What it does:

  • clones repositories you don't have locally
  • pulls changes for repositories you already have locally
  • warns you about local changes and other unexpected situations:
    • unknown files in the tree (in --verbose mode only)
    • staged but not committed changes
    • uncommitted (and unstaged changes)
    • non-default branch checked out
    • committed changes that haven't been pushed to default branch
    • remote URL pointing to an unexpected location (in --verbose mode only)

You can ask it to not change any files on disk and just look for pending changes by running ghcloneall --dry-run. This will also make the check faster!


Other command-line options:

$ ghcloneall --help
usage: ghcloneall [-h] [--version] [-c CONCURRENCY] [-n] [-q] [-v]
                  [--start-from REPO] [--organization ORGANIZATION]
                  [--user USER] [--github-token GITHUB_TOKEN] [--gists]
                  [--repositories] [--pattern PATTERN] [--include-forks]
                  [--exclude-forks] [--include-archived] [--exclude-archived]
                  [--include-private] [--exclude-private] [--include-disabled]
                  [--exclude-disabled] [--init] [--http-cache DBNAME]

Clone/update all user/org repositories from GitHub.

  -h, --help            show this help message and exit
  --version             show program's version number and exit
                        set concurrency level (default: 4)
  -n, --dry-run         don't pull/clone, just print what would be done
  -q, --quiet           terser output
  -v, --verbose         perform additional checks
  --start-from REPO     skip all repositories that come before REPO
  --organization ORGANIZATION
                        specify the GitHub organization
  --user USER           specify the GitHub user
  --github-token GITHUB_TOKEN
                        specify the GitHub token
  --gists               clone user's gists
  --repositories        clone user's or organisation's repositories (default)
  --pattern PATTERN     specify repository name glob pattern to filter
  --include-forks       include repositories forked from other users/orgs
  --exclude-forks       exclude repositories forked from other users/orgs
  --include-archived    include archived repositories
  --exclude-archived    exclude archived repositories (default)
  --include-private     include private repositories (default when a github
                        token is provided)
  --exclude-private     exclude private repositories
  --include-disabled    include disabled repositories (default)
  --exclude-disabled    exclude disabled repositories
  --init                create a .ghcloneallrc from command-line arguments
  --http-cache DBNAME   cache HTTP requests on disk in an sqlite database for
                        5 minutes (default: .httpcache)
  --no-http-cache       disable HTTP disk caching

Configuration file

The script looks for .ghcloneallrc in the current working directory, which should look like this:

# Provide either github_user or github_org, but not both
# github_org = ZopeFoundation
github_user = mgedmin
pattern = *.vim
# Provide github token for authentication
# github_token = <my-github-token>
# You can also uncomment and change these if you wish
# gists = False
# include_forks = False
# include_archived = False
# Listing private repositories requires a valid github_token
# include_private = True
# include_disabled = True

You can create one with ghcloneall --init --{user,org} X [--pattern Y] [--{include,exclude}-{forks,archived,private,disabled}] [--gists|--repos].


For best results configure SSH persistence to speed up git pulls -- in your ~/.ssh/config:

ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/control-%r@%h-%p

It takes about 80 seconds to run git pull on all 382 ZopeFoundation repos on my laptop with this kind of setup.


Script to clone/update all user/organization repos from GitHub






Sponsor this project