create-clone is a template repository scaffolding tool that creates copies of git repositories with support for private repos. It taps into the compressed tarball of a repository to quickly pull down a copy without all that extra git cruft.
- π Supports GitHub repos, GitHub gists, GitLab and Bitbucket
- π‘ Understands GitHub shorthand (
rdmurphy/my-cool-template) for referring to repositories - π With proper credentials in place can clone private repositories on GitHub, GitLab and Bitbucket
create-clone requires at least Node 10 to run.
This library expects to be used in a global context and makes the most sense when installed globally.
npm install --global create-clone
# or
yarn global add create-cloneThis also means it works great when paired with npx.
npx create-clone <repository> <dest>However! create-clone's unique name gives it another super power β you can use a special feature of npm init and yarn create.
npm init clone <repository> <dest>
# or
yarn create clone <repository> <dest>This is most of the reason this library exists. πΆ
create-clone works any git host URLs that hosted-git-info supports. By default the copy of the repository is output into your current working directory. A path to a different directory can be provided as the second parameter and will be created if necessary.
# The contents of the repository will be copied into the current directory
create-clone user/repository
# The contents of the repository will be copied into provided directory (and created if necessary)
create-clone user/repository my-new-projectBy default create-clone will stop and not touch a target directory that already contains files, but this can be overriden with --force.
# I already have something in the "my-old-project" directory, but I don't care
create-clone user/repository my-old-project --force# shortcuts only available to GitHub
create-clone user/repository
create-clone user/repository#branch
create-clone github:user/repository
create-clone github:user/repository.git
create-clone github:user/repository#branch
create-clone github:user/repository.git#branch
# github.com and www.github.com are both supported
create-clone https://github.com/user/repository
create-clone https://github.com/user/repository.git
create-clone https://github.com/user/repository#branch
create-clone https://github.com/user/repository.git#branch
create-clone [email protected]:user/repository
create-clone [email protected]:user/repository.git
create-clone [email protected]:user/repository#branch
create-clone [email protected]:user/repository.git#branchcreate-clone gitlab:user/repository
create-clone gitlab:user/repository.git
create-clone gitlab:user/repository#branch
create-clone gitlab:user/repository.git#branch
# gitlab.com and www.gitlab.com are both supported
create-clone https://gitlab.com/user/repository
create-clone https://gitlab.com/user/repository.git
create-clone https://gitlab.com/user/repository#branch
create-clone https://gitlab.com/user/repository.git#branch
create-clone [email protected]:user/repository
create-clone [email protected]:user/repository.git
create-clone [email protected]:user/repository#branch
create-clone [email protected]:user/repository.git#branchcreate-clone bitbucket:user/repository
create-clone bitbucket:user/repository.git
create-clone bitbucket:user/repository#branch
create-clone bitbucket:user/repository.git#branch
# bitbucket.org and www.bitbucket.org are both supported
create-clone https://bitbucket.org/user/repository
create-clone https://bitbucket.org/user/repository.git
create-clone https://bitbucket.org/user/repository#branch
create-clone https://bitbucket.org/user/repository.git#branch
create-clone [email protected]:user/repository
create-clone [email protected]:user/repository.git
create-clone [email protected]:user/repository#branch
create-clone [email protected]:user/repository.git#branchcreate-clone gist:user/hash
create-clone gist:user/hash.git
create-clone gist:user/hash#branch
create-clone gist:user/hash.git#branch
create-clone [email protected]:hash.git
create-clone git+https://gist.github.com:hash.git
create-clone git+https://gist.github.com:hash.git
create-clone https://gist.github.com/user/hash
create-clone https://gist.github.com/user/hash.git
create-clone https://gist.github.com/user/hash#branch
create-clone https://gist.github.com/user/hash.git#branch
create-clone [email protected]:user/hash
create-clone [email protected]:user/hash.git
create-clone [email protected]:user/hash#branch
create-clone [email protected]:user/hash.git#branchGitHub, GitLab and Bitbucket all have varying methods for authenticating against their services, so each one needs slightly different permissions and keys.
Fun fact β Private GitHub gists are already supported without any additional authentication because they're only "private" as long as no one else has the URL. This is a documented feature!
create-clone requires a GitHub personal access token with read access for repositories and/or gists. Once you have this token, it needs to be available in your environment at GITHUB_TOKEN.
In your .bashrc/.zshrc/preferred shell config:
export GITHUB_TOKEN=<personal-access-token>create-clone will check for this environment variable when attempting to clone a GitHub repository or gist and include it as an authorization header in the request. create-clone will be able to clone any private GitHub repo your account can access.
GitLab also has personal access tokens, but because access to the archive of a private repository is only available via the GitLab API, your token needs to be given the scope of api access, not read_repository. Once you have this token, it needs to be available in your environment at GITLAB_TOKEN.
In your .bashrc/.zshrc/preferred shell config:
export GITLAB_TOKEN=<personal-access-token>create-clone will check for this environment variable when attempting to clone a GitLab repository and include it as an authorization header in the request. create-clone will be able to clone any private GitLab repo your account can access.
This is the funky one. Bitbucket does not have the equivalent of a personal access token, so we need to use what it calls an app password. The only permission your app password needs is Repositories -> Read. However, because we are using what's essentially a single-purpose password, we also need to include your Bitbucket username as part of the request. To accomplish this, we need to set up two environmental variables: BITBUCKET_USER for your username, and BITBUCKET_TOKEN for your app password.
In your .bashrc/.zshrc/preferred shell config:
export BITBUCKET_USER=<your-bitbucket-username>
export BITBUCKET_TOKEN=<app-password>create-clone will check for this environment variable when attempting to clone a Bitbucket repository and include it as the user and password of the request. create-clone will be able to clone any private Bitbucket repo your account can access.
What makes this different from degit?
Honestly? Not a whole lot. This was mostly me wanting to be able to do something cool like npm init clone <repo>/yarn create clone <repo>.
The most notable difference is create-clone does not have a caching layer like degit does. In practice I've not found that to be a major issue, but it may be a big deal for some folks! degit also has a cool actions framework layered on top.
MIT