{"id":13910947,"url":"https://github.com/rustworkshop/gitopolis","last_synced_at":"2025-07-18T10:31:58.755Z","repository":{"id":37947635,"uuid":"502306370","full_name":"rustworkshop/gitopolis","owner":"rustworkshop","description":"Manage multiple git repositories","archived":false,"fork":false,"pushed_at":"2025-06-14T18:08:34.000Z","size":438,"stargazers_count":24,"open_issues_count":16,"forks_count":3,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-06-14T18:53:41.260Z","etag":null,"topics":["git"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rustworkshop.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","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},"funding":{"github":"timabell","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2022-06-11T09:35:05.000Z","updated_at":"2025-06-14T18:08:37.000Z","dependencies_parsed_at":"2023-09-08T00:59:14.311Z","dependency_job_id":"a9f0db22-464f-415e-8d0b-5e96c491286c","html_url":"https://github.com/rustworkshop/gitopolis","commit_stats":null,"previous_names":["rustworkshop/gitopolis"],"tags_count":58,"template":false,"template_full_name":null,"purl":"pkg:github/rustworkshop/gitopolis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustworkshop%2Fgitopolis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustworkshop%2Fgitopolis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustworkshop%2Fgitopolis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustworkshop%2Fgitopolis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rustworkshop","download_url":"https://codeload.github.com/rustworkshop/gitopolis/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustworkshop%2Fgitopolis/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265742296,"owners_count":23820823,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["git"],"created_at":"2024-08-07T00:01:51.275Z","updated_at":"2025-07-18T10:31:58.331Z","avatar_url":"https://github.com/rustworkshop.png","language":"Rust","funding_links":["https://github.com/sponsors/timabell"],"categories":["Rust"],"sub_categories":[],"readme":"# Gitopolis\n\nManage multiple git repositories with ease.\n\n* 🤓 -\u003e Run any shell or git command on multiple `git` repositories.\n* 🤓 -\u003e Re-clone all your repos on new machines.\n* 🤓 -\u003e Limit actions to custom tags.\n* 🤓 -\u003e Easy to remember and use command list (`add` / `exec` / `clone` / `tag`).\n* 🤓 -\u003e A-GPL v3 licensed labour of love ❤️.\n\n## Installation\n\n1. Grab the [latest release](https://github.com/timabell/gitopolis/releases/latest),\n2. unzip it\n3. put the binary somewhere in your `PATH`.\n\nI suggest adding a shorter shell alias to save typing. Perhaps `gm` for git many or `gop`.\n\n## Usage\n\n### Initial setup\n```sh\ncd ~/repos/\ngitopolis add *\n```\n\n### Running shell / git commands in many repos\n```sh\ngitopolis exec -- git pull\n```\n\n### Tagging\n\n```sh\ngitopolis tag some_tag repo1 repo2\ngitopolis exec -t some_tag -- git pull\n```\n\n### Re-cloning repos on a new machine\n\n```sh\nmkdir ~/repos/ \u0026\u0026 cd ~/repos/\n\nwget https://gist.githubusercontent.com/timabell/87add070a8a44db4985586efe380757d/raw/08be5b3c38190eeed4fda0060818fa39f3c67ee3/.gitopolis.toml\n\ngitopolis clone\n```\n\n### Using shell aliases\n\nYou can't currently use shell aliases because commands are executed directly rather than passing through a shell such as bash/zsh/fish. See \u003chttps://github.com/rustworkshop/gitopolis/issues/13\u003e.\n\nAs a workaround you can create git aliases that run arbitrary shell commands. See \u003chttps://github.com/rustworkshop/gitopolis/issues/80#issuecomment-1803344802\u003e\n\n### Using chained commands\n\nYou can't chain commands together with `\u0026\u0026` or `||` like this `gitopolis exec -- git branch \u0026\u0026 git pull` because the shell (bash etc) will parse the `\u0026\u0026` before it ever gets to gitopolis.\n\nAs a workaround you can create git aliases that run arbitrary shell commands. See \u003chttps://github.com/rustworkshop/gitopolis/issues/80#issuecomment-1803344802\u003e\n\n### State file\n\nCreates a single simple `.gitopolis.toml` file that you can edit, read, share with others and copy to other machines.\n\n```toml\n[[repos]]\npath = \"gitopolis\"\ntags = [\"tim\"]\n[repos.remotes.origin]\nname = \"origin\"\nurl = \"git@github.com:timabell/gitopolis.git\"\n\n[[repos]]\npath = \"schema-explorer\"\ntags = [\"tim\", \"databases\"]\n[repos.remotes.origin]\nname = \"origin\"\nurl = \"git@github.com:timabell/schema-explorer.git\"\n\n[[repos]]\npath = \"database-diagram-scm\"\ntags = [\"databases\"]\n[repos.remotes.origin]\nname = \"origin\"\nurl = \"git@github.com:timabell/database-diagram-scm.git\"\n```\n\n[View as gist](https://gist.github.com/timabell/87add070a8a44db4985586efe380757d).\n\n[TOML](https://toml.io/) is a well-supported config markup with parsers for many programming languages.\n\n---\n\n---\n\n## The name\n\nThink a [metropolis](https://en.wikipedia.org/wiki/Metropolis) of git repos.\n\nIt's a lot to type as a name, but it's nice and unique, and if you use it a lot I suggest you create a shell alias to something shorter.\n\n## Why did I create this?\n\n* Wanted to learn more [Rust](https://www.rust-lang.org/).\n* Had a client with many microservices and teams.\n* Tried [gita](https://github.com/nosarthur/gita) but found command layout hard to remember, and didn't like having to install python.\n* To help others with their microservices.\n\n## Social\n\nHelp others discover gitopolis:\n\n### Twitter\n\n[Tweet about gitopolis](http://twitter.com/share?text=Gitopolis%20is%20fab,%20check%20it%20out%20-%20made%20by%20@tim_abell\u0026url=https://github.com/timabell/gitopolis)\n\n### Product Hunt\n\nVote for gitopolis:\n\n\u003ca href=\"https://www.producthunt.com/posts/gitopolis?utm_source=badge-featured\u0026utm_medium=badge\u0026utm_souce=badge-gitopolis\" target=\"_blank\"\u003e\u003cimg src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=392942\u0026theme=light\" alt=\"Gitopolis - Manage\u0026#0032;multiple\u0026#0032;git\u0026#0032;repositories\u0026#0032;with\u0026#0032;ease\u0026#0046; | Product Hunt\" style=\"width: 250px; height: 54px;\" width=\"250\" height=\"54\" /\u003e\u003c/a\u003e\n\n## Contributing\n\nSuggestions welcome, particularly adding your experience, problems and ideas to the issues list.\n\nI'm happy for people to open issues that are actually just questions and support queries.\n\nRough internal design and ambitions can be found at [Design.md](Design.md).\n\nPRs are appreciated but bear in mind I have my own plans and this is a side project for me to learn rust in a useful way, so worth talking to me before investing too much time in anything that might not fit yet. I hope to make this smoother with better CI tests etc. Start by opening an issue with your thoughts, or ping me some other way (I'm easy to find for better or worse).\n\n### Builds\n\n* [![build-main](https://github.com/timabell/gitopolis/actions/workflows/build-main.yml/badge.svg)](https://github.com/timabell/gitopolis/actions/workflows/build-main.yml) - Continuous integration build.\n* [![build-tag](https://github.com/timabell/gitopolis/actions/workflows/build-tag.yml/badge.svg)](https://github.com/timabell/gitopolis/actions/workflows/build-tag.yml) - Release build - generates binaries for download from tagged builds.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frustworkshop%2Fgitopolis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frustworkshop%2Fgitopolis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frustworkshop%2Fgitopolis/lists"}