id = "ghorg"
name = "ghorg"
homepage = "https://github.com/gabrie30/ghorg"
description = "A command-line utility to clone all repositories belonging to a GitHub organization."
executables = ["ghorg"]
[dotfiles]
paths = ["[configHome]/ghorg/ghorgignore"]
secret = ["[configHome]/ghorg/conf.yaml"]
[commands]
format = 1
label = "Clone an organization"
description = "Clone every repository of an organization, group or user. Tokens are deliberately not a field; keep them in the ghorg config or the environment."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = false, short_bundles = false }
[[commands.subcommand]]
path = ["clone"]
label = "Clone all repositories of an owner"
[[commands.subcommand.source]]
id = "readme"
kind = "help"
url = "https://github.com/gabrie30/ghorg#how-to-use"
revision = "2026-10-27"
evidence = """
$ ghorg clone davecheney --clone-type=user --token=<token>
$ ghorg clone gitlab-examples --scm=gitlab --preserve-dir --token=<token>
$ ghorg clone all-groups --scm=gitlab --base-url=https://gitlab.internal.yourcompany.com --preserve-dir
$ ghorg clone kubernetes --path=/tmp/ghorg
$ ghorg clone kubernetes --match-regex=^sig- --output-dir=kubernetes-sig-only
Skip archived repos: use `--skip-archived`
Skip forked repos: use `--skip-forks`
ghorg clone kubernetes --backup --clone-wiki --include-submodules
Use the `--concurrency` flag
"""
[[commands.subcommand.field]]
id = "owner"
label = "Organization, group or user"
type = "string"
position = 0
sources = ["readme"]
[[commands.subcommand.field]]
id = "scm"
label = "Hosting service"
type = "string"
option = ["--scm"]
suggestions = [{ value = "gitlab", label = "GitLab" }]
sources = ["readme"]
[[commands.subcommand.field]]
id = "clone_type"
label = "Owner type"
type = "string"
option = ["--clone-type"]
suggestions = [{ value = "user", label = "User" }]
sources = ["readme"]
[[commands.subcommand.field]]
id = "base_url"
label = "Self-hosted base URL"
type = "url"
option = ["--base-url"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "path"
label = "Clone into (absolute path)"
type = "path"
option = ["--path"]
path = { kind = "directory", role = "output", must_exist = false }
sources = ["readme"]
[[commands.subcommand.field]]
id = "output_dir"
label = "Output directory name"
type = "string"
option = ["--output-dir"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "match_regex"
label = "Only repositories matching regex"
type = "string"
option = ["--match-regex"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "skip_archived"
label = "Skip archived"
type = "boolean"
option = ["--skip-archived"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "skip_forks"
label = "Skip forks"
type = "boolean"
option = ["--skip-forks"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "preserve_dir"
label = "Preserve directory structure"
type = "boolean"
option = ["--preserve-dir"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "backup"
label = "Mirror backup"
type = "boolean"
option = ["--backup"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "concurrency"
label = "Concurrent clones"
type = "integer"
option = ["--concurrency"]
sources = ["readme"]
[[commands.subcommand.task]]
id = "clone"
label = "Clone an organization"
fields = ["owner", "path", "skip_archived", "skip_forks"]
required = ["owner"]
[[commands.subcommand.task]]
id = "backup"
label = "Mirror backup"
set = { backup = [true] }
lock = ["backup"]
fields = ["owner", "path", "skip_archived"]
required = ["owner"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["owner", "scm", "clone_type", "path", "skip_archived", "skip_forks"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["base_url", "output_dir", "match_regex", "preserve_dir", "backup", "concurrency"]