$ ghq get https://github.com/x-motemen/ghq # Runs `git clone https://github.com/x-motemen/ghq ~/ghq/github.com/x-motemen/ghq`
ghq - Manage remote repository clones
'ghq' provides a way to organize remote repository clones, like go get does. When you clone a remote repository by ghq get, ghq makes a directory under a specific root directory (by default ~/ghq) using the remote repository URL’s host and path.
$ ghq get https://github.com/x-motemen/ghq # Runs `git clone https://github.com/x-motemen/ghq ~/ghq/github.com/x-motemen/ghq`
You can also list local repositories (ghq list).
ghq get [-u] [-p] [--shallow] [--vcs <vcs>] [--look] [--silent] [--branch] [--no-recursive] [--bare] [--clean-bare] [--partial blobless|treeless] <repository URL>|<host>/<user>/<project>|<user>/<project>|<project> ghq list [-p] [-e] [<query>] ghq create [--vcs <vcs>] <repository URL>|<host>/<user>/<project>|<user>/<project>|<project> ghq rm [--dry-run] <repository URL>|<host>/<user>/<project>|<user>/<project>|<project> ghq migrate [-y] [--dry-run] <local repository path> ghq root [--all]
Clone a remote repository under ghq root directory (see
DIRECTORY STRUCTURES below). ghq clone is an alias for this command.
If the repository is
already cloned to local, nothing will happen unless '-u' ('--update')
flag is supplied, in which case the local repository is updated ('git pull --ff-only' eg.).
When you use '-p' option, the repository is cloned via SSH protocol.
If there are multiple ghq.root s, existing local clones are searched
first. Then a new repository clone is created under the primary root if
none is found.
With '--shallow' option, a "shallow clone" will be performed (for Git
repositories only, 'git clone --depth 1 …' eg.). Be careful that a
shallow-cloned repository cannot be pushed to remote.
Currently Git and Mercurial repositories are supported.
With '--branch' option, you can clone the repository with specified
branch. This option is currently supported for Git, Mercurial,
Subversion and git-svn.
The 'ghq' gets the git repository recursively by default.
We can prevent it with '--no-recursive' option.
With '--bare' option, a "bare clone" will be performed (for Git
repositories only, 'git clone --bare …' eg.). The on-disk directory
receives a '.git' suffix (e.g. '<root>/host/user/repo.git').
With '--clean-bare' option, a bare clone is performed but the bare
gitdir is placed as a '.git' subdirectory of an unsuffixed parent
(e.g. '<root>/host/user/repo/.git'). This layout keeps the repository
directory name clean and allows Git worktrees to live as sibling
subdirectories:
repo/ ├── .git/ # bare repository ├── main/ # worktree ├── feature/ # worktree └── bugfix/ # worktree
'--clean-bare' implies '--bare'. Passing both together is not an error:
'--bare' is ignored (with a warning) and the clone follows the
'--clean-bare' layout.
With '--partial' option, a "partial clone" will be performed (for Git
repositories only, in 'blobless' mode, 'git clone --filter=blob:none …',
in 'treeless' mode, 'git clone --filter=tree:0 …' eg.).
List locally cloned repositories. If a query argument is given, only repositories whose names contain that query text are listed. '-e' ('--exact') forces the match to be an exact one (i.e. the query equals to project, user/project or host/user/project) If '-p' ('--full-path') is given, the full paths to the repository root are printed instead of relative ones.
Prints repositories' root (i.e. ghq.root). Without '--all' option, the
primary one is shown.
Remove local repository. If '--dry-run' option is given, the repository is not actually removed but the path to it is printed.
Creates new repository.
Migrate an existing repository directory to the ghq-managed directory structure. The command detects the VCS backend, retrieves the remote URL, and moves the repository to the appropriate location under ghq root.
Configuration uses 'git-config' variables.
The path to directory under which cloned repositories are placed. See
DIRECTORY STRUCTURES below. Defaults to ~/ghq.
This variable can have multiple values. If so, the last one becomes
primary one i.e. new repository clones are always created under it. You may
want to specify "$GOPATH/src" as a secondary root (environment variables
should be expanded.)
In ghq, when specifying only the repository name without slashes as in ghq get {{Project}},
ghq attempts to auto-complete the repository owner.
By default, the owner used is the value of the environment variable USER (or USERNAME on Windows).
Setting this option allows you to explicitly specify the owner.
Rather than always using your own username for owner completion,
you may want to complete the owner with the same name as the repository.
For example, fetch ruby as github.com/ruby/ruby,
vim as github.com/vim/vim, and peco as github.com/peco/peco.
If you prefer this behavior, set this option to false to switch the owner completion method.
The default host used when the repository specification omits the host.
For example, ghq get owner/project normally resolves to github.com/owner/project.
If this option is set, the specified host will be used instead.
ghq tries to detect the remote repository’s VCS backend for non-"github.com"
repositories. With this option you can explicitly specify the VCS for the
remote repository. The URL is matched against '<url>' using 'git config --get-urlmatch'.
Accepted values are "git", "github" (an alias for "git"), "subversion",
"svn" (an alias for "subversion"), "git-svn", "mercurial", "hg" (an alias for "mercurial"),
"darcs", "fossil", "bazaar", and "bzr" (an alias for "bazaar").
To get this configuration variable effective, you will need Git 1.8.5 or higher.
The "ghq" tries to detect the remote repository-specific root directory. With this option,
you can specify a repository-specific root directory instead of the common ghq root directory.
The URL is matched against '<url>' using 'git config --get-urlmatch'.
Since ghq get runs git clone for Git repositories, git’s own configuration applies as
well. For example, clone.defaultRemoteName changes the name of the created remote, which
is origin by default.
To get this configuration variable effective, you will need Git 2.30 or higher.
[ghq "https://git.example.com/repos/"] vcs = git root = ~/myproj
If set to a path, this value is used as the only root directory regardless of other existing ghq.root settings.
Local repositories are placed under 'ghq.root' with named github.com/user/repo.
~/ghq
|-- code.google.com/
| `-- p/
| `-- vim/
`-- github.com/
|-- google/
| `-- go-github/
|-- motemen/
| `-- ghq/
`-- urfave/
`-- cli/
brew install ghq
xbps-install -S ghq
guix install ghq
scoop install ghq
go install github.com/x-motemen/ghq@latest
conda install -c conda-forge go-ghq
asdf plugin add ghq asdf install ghq latest
mise install ghq mise use ghq
nix run nixpkgs#ghq # run ghq once nix profile install nixpkgs#ghq # install ghq to your profile
git clone https://github.com/x-motemen/ghq . make install
Built binaries are available from GitHub Releases. https://github.com/x-motemen/ghq/releases
You can buy "ghq-handbook" from Leanpub for more detailed usage.
The source Markdown files of this book are also available for free from the following repository.
Currently, only Japanese version available. Your translations are welcome!
Overall
Maintained
Code review
Go module
Latest release
Releases this year
(top 24 of 51)
174 followers · starred May 2026
523 followers · starred Aug 2026
5,022 followers · starred Jul 2019
283 followers · starred May 2022
ghq - Manage remote repository clones
'ghq' provides a way to organize remote repository clones, like go get does. When you clone a remote repository by ghq get, ghq makes a directory under a specific root directory (by default ~/ghq) using the remote repository URL’s host and path.
$ ghq get https://github.com/x-motemen/ghq # Runs `git clone https://github.com/x-motemen/ghq ~/ghq/github.com/x-motemen/ghq`
You can also list local repositories (ghq list).
ghq get [-u] [-p] [--shallow] [--vcs <vcs>] [--look] [--silent] [--branch] [--no-recursive] [--bare] [--clean-bare] [--partial blobless|treeless] <repository URL>|<host>/<user>/<project>|<user>/<project>|<project> ghq list [-p] [-e] [<query>] ghq create [--vcs <vcs>] <repository URL>|<host>/<user>/<project>|<user>/<project>|<project> ghq rm [--dry-run] <repository URL>|<host>/<user>/<project>|<user>/<project>|<project> ghq migrate [-y] [--dry-run] <local repository path> ghq root [--all]
Clone a remote repository under ghq root directory (see
DIRECTORY STRUCTURES below). ghq clone is an alias for this command.
If the repository is
already cloned to local, nothing will happen unless '-u' ('--update')
flag is supplied, in which case the local repository is updated ('git pull --ff-only' eg.).
When you use '-p' option, the repository is cloned via SSH protocol.
If there are multiple ghq.root s, existing local clones are searched
first. Then a new repository clone is created under the primary root if
none is found.
With '--shallow' option, a "shallow clone" will be performed (for Git
repositories only, 'git clone --depth 1 …' eg.). Be careful that a
shallow-cloned repository cannot be pushed to remote.
Currently Git and Mercurial repositories are supported.
With '--branch' option, you can clone the repository with specified
branch. This option is currently supported for Git, Mercurial,
Subversion and git-svn.
The 'ghq' gets the git repository recursively by default.
We can prevent it with '--no-recursive' option.
With '--bare' option, a "bare clone" will be performed (for Git
repositories only, 'git clone --bare …' eg.). The on-disk directory
receives a '.git' suffix (e.g. '<root>/host/user/repo.git').
With '--clean-bare' option, a bare clone is performed but the bare
gitdir is placed as a '.git' subdirectory of an unsuffixed parent
(e.g. '<root>/host/user/repo/.git'). This layout keeps the repository
directory name clean and allows Git worktrees to live as sibling
subdirectories:
repo/ ├── .git/ # bare repository ├── main/ # worktree ├── feature/ # worktree └── bugfix/ # worktree
'--clean-bare' implies '--bare'. Passing both together is not an error:
'--bare' is ignored (with a warning) and the clone follows the
'--clean-bare' layout.
With '--partial' option, a "partial clone" will be performed (for Git
repositories only, in 'blobless' mode, 'git clone --filter=blob:none …',
in 'treeless' mode, 'git clone --filter=tree:0 …' eg.).
List locally cloned repositories. If a query argument is given, only repositories whose names contain that query text are listed. '-e' ('--exact') forces the match to be an exact one (i.e. the query equals to project, user/project or host/user/project) If '-p' ('--full-path') is given, the full paths to the repository root are printed instead of relative ones.
Prints repositories' root (i.e. ghq.root). Without '--all' option, the
primary one is shown.
Remove local repository. If '--dry-run' option is given, the repository is not actually removed but the path to it is printed.
Creates new repository.
Migrate an existing repository directory to the ghq-managed directory structure. The command detects the VCS backend, retrieves the remote URL, and moves the repository to the appropriate location under ghq root.
Configuration uses 'git-config' variables.
The path to directory under which cloned repositories are placed. See
DIRECTORY STRUCTURES below. Defaults to ~/ghq.
This variable can have multiple values. If so, the last one becomes
primary one i.e. new repository clones are always created under it. You may
want to specify "$GOPATH/src" as a secondary root (environment variables
should be expanded.)
In ghq, when specifying only the repository name without slashes as in ghq get {{Project}},
ghq attempts to auto-complete the repository owner.
By default, the owner used is the value of the environment variable USER (or USERNAME on Windows).
Setting this option allows you to explicitly specify the owner.
Rather than always using your own username for owner completion,
you may want to complete the owner with the same name as the repository.
For example, fetch ruby as github.com/ruby/ruby,
vim as github.com/vim/vim, and peco as github.com/peco/peco.
If you prefer this behavior, set this option to false to switch the owner completion method.
The default host used when the repository specification omits the host.
For example, ghq get owner/project normally resolves to github.com/owner/project.
If this option is set, the specified host will be used instead.
ghq tries to detect the remote repository’s VCS backend for non-"github.com"
repositories. With this option you can explicitly specify the VCS for the
remote repository. The URL is matched against '<url>' using 'git config --get-urlmatch'.
Accepted values are "git", "github" (an alias for "git"), "subversion",
"svn" (an alias for "subversion"), "git-svn", "mercurial", "hg" (an alias for "mercurial"),
"darcs", "fossil", "bazaar", and "bzr" (an alias for "bazaar").
To get this configuration variable effective, you will need Git 1.8.5 or higher.
The "ghq" tries to detect the remote repository-specific root directory. With this option,
you can specify a repository-specific root directory instead of the common ghq root directory.
The URL is matched against '<url>' using 'git config --get-urlmatch'.
Since ghq get runs git clone for Git repositories, git’s own configuration applies as
well. For example, clone.defaultRemoteName changes the name of the created remote, which
is origin by default.
To get this configuration variable effective, you will need Git 2.30 or higher.
[ghq "https://git.example.com/repos/"] vcs = git root = ~/myproj
If set to a path, this value is used as the only root directory regardless of other existing ghq.root settings.
Local repositories are placed under 'ghq.root' with named github.com/user/repo.
~/ghq
|-- code.google.com/
| `-- p/
| `-- vim/
`-- github.com/
|-- google/
| `-- go-github/
|-- motemen/
| `-- ghq/
`-- urfave/
`-- cli/
brew install ghq
xbps-install -S ghq
guix install ghq
scoop install ghq
go install github.com/x-motemen/ghq@latest
conda install -c conda-forge go-ghq
asdf plugin add ghq asdf install ghq latest
mise install ghq mise use ghq
nix run nixpkgs#ghq # run ghq once nix profile install nixpkgs#ghq # install ghq to your profile
git clone https://github.com/x-motemen/ghq . make install
Built binaries are available from GitHub Releases. https://github.com/x-motemen/ghq/releases
You can buy "ghq-handbook" from Leanpub for more detailed usage.
The source Markdown files of this book are also available for free from the following repository.
Currently, only Japanese version available. Your translations are welcome!
Overall
Maintained
Code review
Go module
Latest release
Releases this year
(top 24 of 51)
174 followers · starred May 2026
523 followers · starred Aug 2026
5,022 followers · starred Jul 2019
283 followers · starred May 2022