Skip to content

Addition to GitHub CLI that clones all public and private repositories. It uses GitHub CLI and its authentication system and passes the filter options through to gh repo list.

License

Notifications You must be signed in to change notification settings

dword-design/gh-repo-clone-all

Repository files navigation

gh-repo-clone-all

npm version Linux macOS Windows compatible Build status Coverage status Dependency status Renovate enabled
Open in Gitpod Buy Me a Coffee PayPal Patreon

Addition to GitHub CLI that clones all public and private repositories. It uses GitHub CLI and its authentication system and passes the filter options through to gh repo list.

Install

# npm
$ npm install -g gh-repo-clone-all

# Yarn
$ yarn global add gh-repo-clone-all

Usage

First of all, you need to have GitHub CLI installed. You can find out by running gh version. Also make sure that you are logged in so that gh-repo-clone-all can fetch the repository list. You can find out by running gh auth status.

Now we can run the command like this:

Usage: gh-repo-clone-all [directory] [options] [gh repo list options] 

You can pass the supported options through from gh repo list. The options below are additional.

Options:
  -b, --branch <branch>  The branch to checkout
  -h, --help             display help for command

See the gh repo list docs for details about the filtering options.

Cloning

The simplest case is to just clone into the current directory (which has to be empty):

$ gh-repo-clone-all

Cloning into /Users/foobar/repos …

Successfully cloned john-doe/repo1.
Successfully cloned john-doe/repo2.
Successfully cloned john-doe/repo3.
Successfully cloned john-doe/repo4.

Done!

Usually you will want to provide a directory name, which is then created:

$ gh-repo-clone-all my-repos

gh repo list has a default limit of 30, which is rather low. So let's put it up to clone more repositories:

$ gh-repo-clone-all my-repos --limit 100

You can actually just put a very high limit to clone everything:

$ gh-repo-clone-all my-repos --limit 9999

Checking Out a Branch

Instead of the default branch, you can checkout a specific branch like this:

$ gh-repo-clone-all my-repos --branch renovate/lock-file-maintenance

Note that if a branch cannot be checked out by a repository, the repository will not be cloned.

Filtering

You can use the filtering options from gh repo list to filter the repositories you would like to clone:

# Clone only archived repositories
$ gh-repo-clone-all --archived

# Clone only forks
$ gh-repo-clone-all --fork

# Clone only repositories of a language
$ gh-repo-clone-all --language lang

# Clone up to a limit
$ gh-repo-clone-all --limit x

# Do not clone archived repositories
$ gh-repo-clone-all --no-archived

# Clone only private repositories
$ gh-repo-clone-all --source

# Clone only public repositories
$ gh-repo-clone-all --public

# Clone only non-forks
$ gh-repo-clone-all --source

The Git Protocol

gh-repo-clone-all uses the protocol defined in GitHub CLI to clone repositories. You can find out which via gh config get git_protocol, and you can set it via gh config set git_protocol [ssh,https].

Contribute

Are you missing something or want to contribute? Feel free to file an issue or a pull request! ⚙️

Support

Hey, I am Sebastian Landwehr, a freelance web developer, and I love developing web apps and open source packages. If you want to support me so that I can keep packages up to date and build more helpful tools, you can donate here:

Buy Me a Coffee  If you want to send me a one time donation. The coffee is pretty good 😊.
PayPal  Also for one time donations if you like PayPal.
Patreon  Here you can support me regularly, which is great so I can steadily work on projects.

Thanks a lot for your support! ❤️

License

MIT License © Sebastian Landwehr