Skip to main content

Clone/update all user/organization GitHub repositories

Project description

ghcloneall

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'
ghcloneall

Clone all ZopeFoundation repositories:

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

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

asciicast

Details

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-master branch checked out

    • committed changes that haven’t been pushed to master

    • 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!

Synopsis

Other command-line options:

$ ghcloneall --help
usage: ghcloneall [-h] [--version] [-c CONCURRENCY] [-n] [-q] [-v]
                  [--start-from REPO] [--organization ORGANIZATION]
                  [--user USER] [--pattern PATTERN] [--init]
                  [--http-cache DBNAME] [--no-http-cache]

Clone/update all user/org repositories from GitHub.

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  -c CONCURRENCY, --concurrency CONCURRENCY
                        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
                        alphabetically
  --organization ORGANIZATION
                        specify the GitHub organization
  --user USER           specify the GitHub user
  --pattern PATTERN     specify repository name pattern to filter
  --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:

[ghcloneall]
# Provide either github_user or github_org, but not both
# github_org = ZopeFoundation
github_user = mgedmin
pattern = *.vim

You can create one with ghcloneall --init --{user,org} X [--pattern Y].

Tips

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

Host github.com
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.

Changelog

1.7.1 (2019-08-14)

  • Drop support for Python 3.3 and 3.4.

  • Add a test suite.

  • Fix AttributeError: ‘str’ object has no attribute ‘format_map’ on Python 2.

1.7.0 (2018-12-19)

  • Command line args: -q, –quiet

  • Fix display corruption on ^C

1.6.1 (2018-10-19)

  • Fix TypeError: get() got an unexpected keyword argument ‘fallback’ on Python 2.

1.6 (2016-12-29)

  • Comprehensive rebranding:

    • Rename the GitHub repository to https://github.com/mgedmin/ghcloneall

    • Rename cloneall.py to ghcloneall.py

    • Rename the config file to .ghcloneallrc, and rename the config section to [ghcloneall].

  • Don’t print tracebacks on ^C (this regressed in 1.5).

1.5 (2016-12-29)

  • Released to PyPI as ghcloneall

  • Added Python 2.7 support

1.4 (2016-12-28)

  • Command line args: –user, –pattern, –init

  • Load (some) options from a .cloneallrc

  • Stop using --organization=ZopeFoundation by default, require an explicit option (or config file)

  • Rename clone_all_zf_repos.py to cloneall.py

1.3 (2016-12-28)

  • Command line args: -c

  • Show progress while fetching the list of repositories from GitHub

  • Update repositories concurrently by default

  • Highlight items in progress

  • Highlight failed items in red

  • Tweak progress bar style from [=== ] to [###..]

  • Clear the progress bar on ^C

  • Handle git errors nicely

  • Bugfix: -vv could fail with NameError if unknown files were present in a working tree

  • Bugfix: correctly show progress when using –start-from

  • Bugfix: script would hang (for 10 minutes) if you didn’t already have an SSH control master process running

  • Bugfix: –dry-run didn’t show which repos were new

1.2 (2016-11-09)

  • Command line args: –dry-run, –verbose

  • Cache HTTP responses on disk for 10 minutes to avoid GitHub API rate limits

  • Report about forgotten uncommitted and staged changes

  • Warn about local (unpushed) commits too

  • Warn about other branches being checked out

  • Default to SSH URLs again (faster when using SSH’s ControlPersist)

1.1 (2015-11-07)

  • Command line args: –version, –start-from, –organization

  • Output formatting: shorter repository names, totals at the end

  • Use ANSI colors to indicate changes

  • Don’t print tracebacks on ^C

  • Default to HTTPS URLs

1.0 (2015-11-07)

  • Moved from a gist to a proper GitHub repository.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ghcloneall-1.7.1.tar.gz (20.5 kB view details)

Uploaded Source

Built Distribution

ghcloneall-1.7.1-py2.py3-none-any.whl (12.2 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file ghcloneall-1.7.1.tar.gz.

File metadata

  • Download URL: ghcloneall-1.7.1.tar.gz
  • Upload date:
  • Size: 20.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3

File hashes

Hashes for ghcloneall-1.7.1.tar.gz
Algorithm Hash digest
SHA256 1aa3860f733cc7da7a29076f3ff51afa5514b186ae5eb7612b52fed47ab0a008
MD5 948d3d5bf2390cc50a16eeebf5249c91
BLAKE2b-256 d4010402881b20be30148d39fc0817c8a7354aabf4c4a7ccc1ade60bd5f97edb

See more details on using hashes here.

File details

Details for the file ghcloneall-1.7.1-py2.py3-none-any.whl.

File metadata

  • Download URL: ghcloneall-1.7.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 12.2 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3

File hashes

Hashes for ghcloneall-1.7.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 5a744ccc61d08df507cd74bedbbfd518691d7a2417d0e423c4b1cd619d82703c
MD5 bd96b3eb135192534c3b92e8f8fd7e3b
BLAKE2b-256 aa01241fdd407762293ed93ebb4edef4a173fb313ce97bbc0a97843f70a72ba8

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page