{"id":29507946,"url":"https://github.com/divvun/gut","last_synced_at":"2026-02-02T19:04:11.388Z","repository":{"id":36951037,"uuid":"248075800","full_name":"divvun/gut","owner":"divvun","description":"A Git(Hub) multirepo maintenance tool","archived":false,"fork":false,"pushed_at":"2026-01-27T11:27:19.000Z","size":765,"stargazers_count":7,"open_issues_count":14,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-27T20:18:37.686Z","etag":null,"topics":["divvun","git","github","indigenous-languages","language-technology","multirepo-maintenance","open-source"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/divvun.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-03-17T21:23:09.000Z","updated_at":"2026-01-23T18:49:53.000Z","dependencies_parsed_at":"2023-10-04T17:30:21.318Z","dependency_job_id":"ea9404e1-fdc0-4541-892f-01243ab55dfd","html_url":"https://github.com/divvun/gut","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/divvun/gut","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divvun%2Fgut","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divvun%2Fgut/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divvun%2Fgut/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divvun%2Fgut/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/divvun","download_url":"https://codeload.github.com/divvun/gut/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divvun%2Fgut/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29017940,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-02T18:51:31.335Z","status":"ssl_error","status_checked_at":"2026-02-02T18:49:20.777Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["divvun","git","github","indigenous-languages","language-technology","multirepo-maintenance","open-source"],"created_at":"2025-07-16T04:06:59.036Z","updated_at":"2026-02-02T19:04:11.381Z","avatar_url":"https://github.com/divvun.png","language":"Rust","readme":"# gut\n\nPronounced `gʉːt`.\n\n[![](https://divvun-tc.thetc.se/api/github/v1/repository/divvun/gut/main/badge.svg)](https://divvun-tc.thetc.se/api/github/v1/repository/divvun/gut/main/latest)\n\nThis is a Git(Hub) multirepo maintenance tool, designed specifically for Divvun. But it should be quite useful to others needing to maintain tens (or hundreds) of similarly structured GitHub repositories.\n\nUsing the `gut apply -s \u003cscript\u003e` command, one can in practice run any git command on all repos (or a suitable subset, regex-selected on the repo names), not only the commands directly provided by `gut`.\n\nWe think it's pretty cool.\n\n## Documentation\n\n**📚 [Full Documentation](docs/)** - Complete guides and references\n\nQuick links:\n\n- [Get Started](docs/docs/get-started.md) - Installation and setup\n- [Common Commands](docs/docs/usage/common-commands.md) - Most frequently used commands\n- [Command Overview](docs/docs/usage/overview.md) - All available commands\n- [Architecture](docs/docs/architecture.md) - Technical details\n- [Contributing](docs/docs/contributing.md) - Development guide\n- [Changelog](CHANGELOG.md) - Release history\n\n### Viewing Documentation Locally\n\nThe documentation is built with [Zensical](https://zensical.org/). To view it locally:\n\n```bash\n# Install Zensical\npip install zensical\n\n# Serve documentation\ncd docs\nzensical serve\n```\n\nThen open \u003chttp://localhost:8000\u003e in your browser.\n\n## Installation\n\nDownload the latest nightly build:\n\n- [Linux](https://pahkat.uit.no/devtools/download/gut?channel=nightly\u0026platform=linux)   (x86_64)\n- [macOS](https://pahkat.uit.no/devtools/download/gut?channel=nightly\u0026platform=macos)   (x86_64)\n- [Windows](https://pahkat.uit.no/devtools/download/gut?channel=nightly\u0026platform=windows) (i686)\n\nExtract the archive, and move the binary to somewhere on your `$PATH`.\n\n### Building from source\n\n1. get [Rust](https://www.rust-lang.org/learn/get-started)\n1. clone this repo: `git clone https://github.com/divvun/gut.git`\n1. `cd gut`\n1. `cargo install --path .`\n\nIf you get compilation errors related to SSL (esp. on the mac), try this variant for the last command above:\n\n`OPENSSL_NO_VENDOR=1 cargo install --path .`\n\n## Setup\n\n1. make a [personal access token](https://github.com/settings/tokens) in GitHub - allow everything. Make sure to store it in a safe place - the token replaces your username and password when accessing GitHub via `gut`.\n1. run `gut init -r \u003croot-dir\u003e -t \u003ctoken\u003e`\n\n`\u003ctoken\u003e` is the token created in step 1. above.\nThe `\u003croot-dir\u003e` is the directory where you want to store all repos processed by `gut`.\nBelow the `\u003croot-dir\u003e` dir, there will be one directory for every organisation you interact with, and within the organisation directory all repos are stored.\n\n### SSH access over the `git` protocoll\n\nTo use the `git`/`ssh` protocol, you need to set up an `ssh` key for GitHub. Follow [these instructions](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent).\n\n## Features\n\n- **Multi-repo operations**: Clone, pull, push, commit, fetch across hundreds of repos with a single command\n- **Regex filtering**: Target specific repos using regex patterns (e.g., `-r \"^lang-.*\"`)\n- **Topic filtering**: Filter repos by GitHub topics (e.g., `--topic lang`)\n- **Multi-org support**: Run commands across all organizations with `--all-orgs` flag\n- **Progress bars**: Visual feedback for long-running operations\n- **Parallel execution**: Network operations run in parallel for speed\n- **Template system**: Apply consistent changes across repos using templates with placeholder substitution\n\n## Usage\n\n\u003e **NB!** Please note that this is a potentially very powerful tool. Some commands require *organisation owner permissions*, and the most dangerous ones will require an *explicit confirmation*. If you get an error that the operation is not permitted, you probably do not have sufficient access to the repos involved.\n\nThere are some [usage instructions](USAGE.md) under development.\n\nThen there are some use cases with example commands\n[here](https://giellalt.github.io/infra/infraremake/HowToMergeUpdatesFromCore.html).\n\n### Common Examples\n\n```bash\n# Clone all repos matching a pattern\ngut clone -o myorg -r \"^api-.*\"\n\n# Pull all repos across all organizations\ngut pull --all-orgs\n\n# Fetch and check status of all repos matching regex\ngut status -r \".*\" --fetch\n\n# Commit changes to all matching repos\ngut commit -r \"^lib-.*\" -m \"Update dependencies\"\n\n# Apply a script to multiple repos\ngut apply -r \".*\" -s ./my-script.sh\n```\n\nFor more details on any command, use `gut \u003ccommand\u003e --help`.\n\nThere is also some rudimentary help text. Run `gut --help` to get an overview:\n\n```\n$ gut --help\ngit multirepo maintenance tool\n\nUsage: gut [OPTIONS] \u003cCOMMAND\u003e\n\nCommands:\n  add       Add users, repos to an organisation/a team\n  apply     Apply a script to all local repositories that match a pattern\n  branch    Set default, set protected branch\n  checkout  Checkout a branch all repositories that their name matches a pattern or a topic\n  ci        Generate or export ci configuration\n  clone     Clone all repositories that matches a pattern\n  clean     Do git clean -f for all local repositories that match a pattern\n  commit    Add all and then commit with the provided messages for all repositories that match a pattern or a topic\n  create    Create team, discussion, repo to an organisation or create a branch for repositories\n  fetch     Fetch all local repositories that match a regex\n  hook      Create, delete hooks for all repositories that match a pattern\n  init      Init configuration data\n  invite    Invite users to an organisation by emails\n  make      Make repositories that match a regex become public/private\n  merge     Merge a branch to the current branch for all repositories that match a pattern\n  pull      Pull the current branch of all local repositories that match a regex\n  push      Push the provided branch to remote server for all repositories that match a pattern or a topic\n  remove    Remove users, repos from an organisation/a team\n  rename    Rename repositories that match a pattern with another pattern\n  set       Set information, secret for repositories or permission for a team\n  show      Show config, list of repositories or users\n  status    Show git status of all repositories that match a pattern\n  template  Apply changes, refresh, or generate new template\n  topic     Add, get, set or apply a script by topic\n  transfer  Transfer repositories that match a regex to another organisation\n  workflow  Run a workflow\n  help      Print this message or the help of the given subcommand(s)\n\nOptions:\n      --format \u003cFORMAT\u003e  [default: table] [possible values: table, json]\n  -h, --help             Print help (see more with '--help')\n  -V, --version          Print version\n```\n\n### Subcommands Reference\n\nCommands with subcommands:\n\n```\nadd\n    repos          Add all matched repositories to a team by using team_slug\n    users          Invite users by users' usernames to an organisation\n\nbranch\n    default        Set a branch as default for all repositories that match a pattern\n    protect        Set a branch as protected for all local repositories that match a pattern\n    unprotect      Remove branch protection for all local repositories that match a pattern\n\nci\n    export         Export data file for ci generate command\n    generate       Generate ci for every repositories that matches\n\ncreate\n    branch         Create a new branch for all repositories that match a regex or a topic\n    discussion     Create a discussion for a team in an organisation\n    repo           Create new repositories in an organisation and push for existing git repositories\n    team           Create a new team for an organisation\n\nhook\n    create         Create web hook for repos matching regex\n    delete         Delete ALL web hooks for all repositories that match given regex\n\ninvite\n    users          Invite users to an organisation by emails\n\nremove\n    repositories   Remove repositories from a team\n    users          Remove users by users' usernames from an organisation\n\nset\n    info           Set description and/or website for all repositories that match regex\n    organisation   Set default organisation name for every other command\n    permission     Set access permissions for a team on repos matching regex\n    secret         Set a secret for all repositories that match regex\n\nshow\n    config         Show current configuration\n    repositories   Show all repositories that match a pattern\n    users          Show all users in an organisation\n\ntemplate\n    apply          Apply changes from template to all projects that match the regex\n    generate       Generate a new project from a template\n    refresh        Refresh placeholder substitutions in files based on .gut/delta.toml\n\ntopic\n    add            Add topics for all repositories that match a regex\n    apply          Apply a script to all repositories that have topics matching a pattern\n    get            Get topics for all repositories that match a regex\n    set            Set topics for all repositories that match a regex\n\nworkflow\n    run            Rerun the most recent workflow or send a repository_dispatch event\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdivvun%2Fgut","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdivvun%2Fgut","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdivvun%2Fgut/lists"}