urur
A multi-repo workspace manager for developers who work across many distributed Git repositories.
Why urur?
If you work with multiple Git repositories spread across GitHub, GitLab, and other hosts, you know the pain of:
- Cloning repos one by one
- Checking status of 10+ repos manually
- Running the same command in each repo
- Remembering which repos need to be pulled
urur solves this with a single configuration file that manages all your repositories.
# Clone all your repos
# Check status everywhere
# Pull everything
# Run any command across repos
Installation
From crates.io
From source
Pre-built binaries
Download from the releases page.
Quick Start
# 1. Initialize a workspace
&&
# 2. Add repositories
# 3. Clone everything
# 4. Check status
Configuration
urur uses a .urur.toml file for configuration:
[]
= "my-workspace"
= "All my projects"
[]
= "main"
= false
= 4
= "code" # Editor for 'open' command (code, nvim, zed, etc.)
[[]]
= "project-a"
= "git@github.com:user/project-a.git"
= "work/project-a" # Custom directory structure
= "develop" # Override default branch
= ["work", "rust"]
[[]]
= "project-b"
= "git@github.com:user/project-b.git"
= "personal/project-b"
= ["personal", "python"]
[]
= ["project-a"]
= ["project-a"]
Repository Options
| Field | Description | Default |
|---|---|---|
name |
Unique identifier | Derived from URL |
url |
Git clone URL (HTTPS or SSH) | Required |
path |
Local directory path | Same as name |
branch |
Default branch | From defaults.branch |
tags |
Tags for filtering | [] |
shallow |
Shallow clone | false |
disabled |
Skip this repo | false |
Commands
Workspace Management
Repository Operations
# Add/remove repos
# Clone
Status and Sync
Git Operations
Stash and Branch
# Stash operations
# Branch operations
Execute Commands
Group Management
Remote Management
Move and Import
# Move a repository to a new path
# Import existing git repos from a directory
Select Mode
Focus on a single repository and use urur as a git alias:
# Select a repo (and optionally cd into it)
# Or with automatic cd:
# Now urur commands run on that repo
# Open in editor or browser
# See what's selected
# Back to multi-repo mode (and optionally cd to workspace)
# Or with automatic cd:
Shell Integration
For seamless cd on select/unselect, add to your .bashrc or .zshrc:
# Shell wrapper for urur select/unselect with automatic cd
# Alternative: simple cd helper
Shell Completions
Generate shell completions:
# Bash
# Zsh
# Fish
# PowerShell
Examples
Organize by Project Type
[[]]
= "frontend"
= "git@github.com:company/frontend.git"
= "web/frontend"
= ["web", "typescript"]
[[]]
= "backend"
= "git@github.com:company/backend.git"
= "api/backend"
= ["api", "rust"]
[[]]
= "mobile"
= "git@github.com:company/mobile.git"
= "mobile/app"
= ["mobile", "react-native"]
Work vs Personal
[]
= ["frontend", "backend", "mobile"]
= ["dotfiles", "blog", "side-project"]
# Pull only work repos
# urur pull --group work
# Status of personal projects
# urur status --group personal
Microservices
[[]]
= "auth-service"
= "git@github.com:company/auth-service.git"
= ["service", "critical"]
[[]]
= "user-service"
= "git@github.com:company/user-service.git"
= ["service"]
[[]]
= "payment-service"
= "git@github.com:company/payment-service.git"
= ["service", "critical"]
# Run tests on all services
# urur exec "make test" --tag service
# Check critical services
# urur status --tag critical
Comparison with Other Tools
| Feature | urur | git-repo | gita | myrepos |
|---|---|---|---|---|
| Config format | TOML | XML | YAML | Config file |
| Tags/Groups | Yes | Yes (projects) | Yes | No |
| Custom paths | Yes | Limited | No | Yes |
| Select mode | Yes | No | No | No |
| Interactive TUI | Yes | No | No | No |
| Cloud sync | Yes | No | No | No |
| Worktrees | Yes | No | No | No |
| Shell completions | Yes | Yes | Yes | No |
| Written in | Rust | Python | Python | Perl |
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
New Features
Interactive TUI
Launch an interactive dashboard to view and manage all repositories:
TUI Features:
- Tree or list view of all repos (
tto toggle) - Real-time status (branch, dirty, ahead/behind)
- Bulk operations on selected repos
- Add repos directly (
akey) - Import from GitHub/GitLab (
ikey) - Move and rename repos (
m,Rkeys) - Search/filter repos (
/key) - Comprehensive help (
?key)
Cloud Sync
Sync your workspace config to a git repository (like your dotfiles):
# Initialize cloud sync
# Push config changes to cloud
# Pull config from cloud
# Check sync status
# Unlink cloud sync
Worktree Management
Manage git worktrees across your repositories:
# Add a worktree for a feature branch
# List worktrees
# Remove a worktree
Import from GitHub/GitLab
Bulk import repositories from your GitHub or GitLab account:
# Import all your GitHub repos
# Import private repos too (requires GITHUB_TOKEN)
# Filter by language
# Import from GitLab
Configurable Editor
Set your preferred editor in the config:
[]
= "nvim" # or "code", "zed", "vim", etc.
Priority: CLI arg > config > $EDITOR > $VISUAL > "code"
Repository Templates
Define templates to quickly add repos with pre-configured settings:
[]
= true
= ["rust", "backend"]
= "libs/"
= "cargo build"
= ["backend"]
[]
= ["javascript", "frontend"]
= "web/"
= "npm install"
Use templates when adding repos:
# Add with template
# List available templates
# Show template details
Template settings (explicit CLI args override template values):
branch: Default branch to checkoutshallow: Whether to shallow clonetags: Tags to apply automaticallypath_prefix: Prefix for the local path (e.g., "libs/" → "libs/repo-name")post_clone: Command to run after cloninggroups: Groups to automatically add the repo to
Hooks
Run custom commands before/after operations:
[]
= true # Abort on pre-hook failure
# Clone hooks
= "echo 'Starting clone...'"
= "npm install"
# Pull hooks
= "git stash"
= "git stash pop"
# Fetch hooks
= "echo 'Fetching...'"
= "echo 'Fetch complete'"
# Sync hooks (for `urur sync` command)
= "echo 'Starting sync...'"
= "echo 'Sync complete'"
Environment variables available in hooks:
URUR_REPO_NAME- Repository nameURUR_REPO_PATH- Repository local pathURUR_REPO_URL- Repository remote URLURUR_WORKSPACE_ROOT- Workspace root directory
Search Across Repos
Search for patterns across all repositories:
Roadmap
- Core workspace management
- Group and tag filtering
- Select mode for single-repo focus
- Shell completions
- Progress bars during operations
- Interactive TUI mode
- GitHub/GitLab import
- Hooks system
- Search across repos
- Parallel operations
- Cloud config sync
- Worktree management
- Configurable editor
- TUI add/import modals
- Repository templates
- Stable repo identity (UUID-based tracking for moves/renames)
- Cloud sync reconciliation (detect moves/deletes across machines)
-
urur reconcilecommand - Workspace snapshots
- Plugin system
See the backlog for future plans.