Skip to content

A cross-platform Git multi-remote synchronization tool built in Rust. Push, pull, and sync your code across multiple Git hosting platforms (GitHub, GitLab, Bitbucket, Codeberg, Gitea/Forgejo) with a single command.

License

Notifications You must be signed in to change notification settings

TIVerse/multigit

Repository files navigation

🌐 MultiGit

One repository. Infinite destinations.

GitHub release CI Status Coverage License

Rust Version Contributors Made with Rust Platform

Stars Issues PRs Welcome Forks

A production-ready, blazingly fast Git multi-remote synchronization tool
Push, pull, and sync your code across GitHub, GitLab, Bitbucket, Codeberg, Gitea/Forgejo with a single command

✨ Available as both multigit and mg commands for your convenience! ✨


πŸ“– Table of Contents

Features β€’ Why MultiGit? β€’ Quick Start β€’ Installation β€’ Usage β€’ Configuration β€’ Security β€’ Examples β€’ FAQ β€’ Contributing β€’ Roadmap


✨ Features

πŸš€ Performance & Reliability

  • ⚑ Blazingly Fast - Parallel operations via Tokio async runtime
  • πŸ”„ Smart Sync - Incremental updates, not full clones
  • πŸ“Š Progress Tracking - Real-time progress bars and status
  • πŸ›‘οΈ Atomic Operations - All-or-nothing commits
  • πŸ” Retry Logic - Automatic retry on transient failures

πŸ”’ Security & Privacy

  • πŸ” OS Keyring Integration - Native credential managers
  • 🌐 Host-Bound Credentials - Tokens scoped to specific hosts
  • πŸ”’ HTTPS Enforcement - Prevents insecure HTTP connections
  • πŸ”‘ Age Encryption - Encrypted credential fallback
  • 🚫 Zero Plain Text - No passwords or tokens in files
  • πŸ“ Audit Logging - Track all sensitive operations
  • πŸ›‘οΈ Secret Redaction - Automatic log sanitization
  • πŸ”’ TLS/SSL - Encrypted network communication

🎯 Intelligent Operations

  • 🧠 Smart Conflict Detection - Prevents data loss
  • πŸ”€ Multiple Merge Strategies - Fast-forward, rebase, merge
  • 🎯 Selective Sync - Choose branches, remotes, files
  • πŸ” Health Checks - Auto-diagnose and fix issues
  • πŸ“ˆ Diff Analysis - See exactly what will sync

🎨 Developer Experience

  • πŸ’» Rich CLI/TUI - Beautiful interactive terminal UI
  • ✨ Conventional Commits - Interactive commit wizard
  • πŸ€– Daemon Mode - Background sync with scheduler
  • 🌍 Cross-Platform - Linux, macOS, Windows
  • πŸ“š Zero Config - Works out-of-the-box

🌐 Supported Platforms

Platform Status Features
GitHub βœ… Full Support Public, Private, Enterprise
GitLab βœ… Full Support Cloud, Self-hosted
Bitbucket βœ… Full Support Cloud, Server
Codeberg βœ… Full Support Public repositories
Gitea βœ… Full Support Self-hosted instances
Forgejo βœ… Full Support Self-hosted instances

πŸ’Ž Why MultiGit?

⚑️ Save Time

One command replaces dozens

Instead of:

git push origin main
git push github main
git push gitlab main
git push backup main

Simply:

mg sync

πŸ›‘οΈ Stay Safe

Never lose your code

  • Automatic conflict detection
  • Safe merge strategies
  • Encrypted credentials
  • Audit logging
  • Rollback support

πŸš€ Work Smarter

Built for developers

  • Zero configuration
  • Interactive wizards
  • Beautiful progress bars
  • Daemon mode
  • CI/CD ready

🎯 Real-World Benefits

Traditional Workflow With MultiGit Time Saved
Push to 3 remotes manually mg sync ~2 minutes
Set up credentials for each platform One-time interactive setup ~15 minutes
Check sync status across platforms mg status ~5 minutes
Resolve conflicts manually Interactive resolver ~10 minutes
Total per day ~30 minutes

πŸ’° That's 180+ hours saved per year for a typical developer!


🎬 Quick Start

Get started in under 2 minutes! Here's the fastest path to multi-remote nirvana:

# 1️⃣ Initialize MultiGit in your repository
mg init                    # or 'multigit init'

# 2️⃣ Add remote platforms (you'll be prompted for credentials)
mg remote add github <username>
mg remote add gitlab <username>
mg remote add bitbucket <username>

# 3️⃣ Make some changes, then use the interactive commit helper
mg cc                      # Interactive conventional commit wizard
# Or use traditional git commands - they work too!

# 4️⃣ Sync to all remotes with one command! πŸš€
mg sync

# 5️⃣ Check sync status across all platforms
mg status

πŸ’‘ Pro Tip: Use mg for lightning-fast typing or multigit for scripts - they're 100% identical!

πŸŽ₯ Demo

$ mg sync
βœ“ Pushing to github...     [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] 100% (main)
βœ“ Pushing to gitlab...     [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] 100% (main)
βœ“ Pushing to bitbucket...  [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] 100% (main)
πŸŽ‰ Successfully synced to 3 remotes in 2.3s

⚑ Performance

3x

Faster than sequential pushes

5

Platforms supported

0

Plain text credentials

100%

Rust, no dependencies issues

πŸ“¦ Installation

Choose your preferred installation method:

πŸš€ From Releases (Easiest)

Download pre-built binaries for your platform from GitHub Releases:

Linux / macOS:

# Download the latest release
curl -LO https://github.com/TIVerse/multigit/releases/latest/download/multigit-linux-x64.tar.gz

# Extract and install
tar -xzf multigit-linux-x64.tar.gz
sudo mv multigit mg /usr/local/bin/

# Verify installation
mg --version

Windows (PowerShell):

# Download and run the installer
Invoke-WebRequest -Uri "https://github.com/TIVerse/multigit/releases/latest/download/multigit-windows-installer.exe" -OutFile "multigit-installer.exe"
.\multigit-installer.exe

πŸ”§ Build from Source

# Clone the repository
git clone https://github.com/TIVerse/multigit.git
cd multigit

# Build release binaries
cargo build --release

# Test the build
./target/release/multigit --version
./target/release/mg --version          # Both binaries are built

# Optional: Install to system
cargo install --path .

🐳 Docker (Coming Soon)

docker pull tiverse/multigit:latest
docker run --rm -v $(pwd):/repo tiverse/multigit mg status

πŸš€ Usage

🎯 Core Workflows

πŸ“‹ Initialize a Repository
# Navigate to your Git repository
cd your-git-repository

# Initialize MultiGit
mg init

# MultiGit creates a .multigit/ directory with configuration
# βœ“ Configuration file created
# βœ“ Default settings applied
# βœ“ Ready to add remotes!
πŸ”— Managing Remote Platforms
# Add GitHub remote
mg remote add github your-username
# You'll be prompted for your Personal Access Token (PAT)

# Add GitLab remote
mg remote add gitlab your-username

# Add Bitbucket
mg remote add bitbucket your-username

# Add self-hosted Gitea/Forgejo
mg remote add mygitea your-username --url https://gitea.example.com

# Add Codeberg
mg remote add codeberg your-username

# List all configured remotes
mg remote list

# Remove a remote
mg remote remove github

# Update remote credentials
mg remote update gitlab --token
πŸ”„ Syncing & Pushing
# Push to all configured remotes
mg push

# Push to specific remote only
mg push --to github

# Push specific branch
mg push --branch develop

# Sync bidirectionally (pull + push)
mg sync

# Sync with conflict resolution
mg sync --interactive

# Force sync (⚠️ use with caution - may overwrite changes)
mg sync --force

# Dry run to preview sync
mg sync --dry-run
πŸ“₯ Pulling Changes
# Pull from primary remote (configured in settings)
mg pull

# Pull from specific remote
mg pull --from github

# Pull specific branch
mg pull --from gitlab --branch main

# Pull and rebase
mg pull --rebase
πŸ“Š Status & Monitoring
# Check sync status across all remotes
mg status

# Detailed status with commit differences
mg status --verbose

# Check specific remote
mg status --remote github

# Watch mode (auto-refresh every 5s)
mg status --watch
✍️ Conventional Commits (Interactive)
# Launch interactive commit wizard
mg cc                    # or 'mg commit'

# The wizard helps you:
# βœ“ Select files to stage
# βœ“ Choose commit type (feat, fix, docs, style, refactor, test, chore)
# βœ“ Auto-detect scope from changed files
# βœ“ Add breaking change markers
# βœ“ Link to issues/tickets
# βœ“ Preview formatted commit message
# βœ“ Commit & optionally push

# Example output:
# ? Select commit type: feat
# ? Scope (optional): auth
# ? Short description: add OAuth2 support
# ? Breaking change?: No
# ? Issue reference: #42
# 
# Preview: feat(auth): add OAuth2 support (#42)
# 
# βœ“ Committed successfully!
βš”οΈ Conflict Resolution
# List all detected conflicts
mg conflict list

# Resolve conflicts interactively
mg conflict resolve

# Choose resolution strategy
mg conflict resolve --strategy ours     # Use local changes
mg conflict resolve --strategy theirs   # Use remote changes
mg conflict resolve --strategy manual   # Manual resolution

# Show conflict diff
mg conflict diff
πŸ€– Daemon Mode (Background Sync)
# Start daemon with 5-minute sync interval
mg daemon start --interval 5m

# Start with hourly sync
mg daemon start --interval 1h

# Check daemon status
mg daemon status

# View daemon logs
mg daemon logs

# Stop daemon
mg daemon stop

# Restart daemon
mg daemon restart

# Configure daemon to run on system startup
mg daemon enable-startup
πŸ” Health Check & Diagnostics
# Run comprehensive health check
mg doctor

# The doctor command checks:
# βœ“ Git installation and version
# βœ“ Remote connectivity
# βœ“ Authentication status
# βœ“ Configuration validity
# βœ“ Repository integrity
# βœ“ Network connectivity

# Auto-fix common issues
mg doctor --fix

# Verbose diagnostics
mg doctor --verbose

πŸŽ“ Common Scenarios

Mirror a project to GitLab

mg remote add gitlab username
mg push --to gitlab

Daily auto-sync

mg daemon start --interval 24h

Backup to multiple hosts

mg remote add github user
mg remote add gitlab user
mg sync

Check all remotes status

mg status --verbose

Emergency conflict fix

mg conflict list
mg conflict resolve --interactive

Test connectivity

mg doctor --verbose

🎨 Advanced Usage

# Chain commands for complex workflows
mg pull --from github && mg cc && mg push

# Use in CI/CD pipelines
mg init && mg remote add gitlab $CI_USERNAME && mg push --to gitlab

# Scheduled sync with cron
# Add to crontab: 0 */6 * * * cd /path/to/repo && mg sync

# Multi-branch sync
for branch in main develop staging; do
  git checkout $branch
  mg sync --branch $branch
done

πŸ“– Configuration

MultiGit uses a hierarchical configuration system with sensible defaults:

πŸ”§ CLI Flags (highest priority)
    ↓
πŸ“ Repository Config (.multigit/config.toml)
    ↓
🏠 User Config (~/.config/multigit/config.toml)
    ↓
βš™οΈ  Default Settings (lowest priority)

πŸ“ Example Configuration

Create a .multigit/config.toml in your repository or ~/.config/multigit/config.toml for global settings:

# ====================================
# MultiGit Configuration
# ====================================

[settings]
# Default branch to sync
default_branch = "main"

# Enable parallel operations for speed
parallel_push = true
max_parallel = 4

# Verbose output
verbose = false

[sync]
# Automatic sync when daemon is running
auto_sync = false

# Primary source for pulling
primary_source = "github"

# Merge strategy: "fast-forward", "rebase", "merge"
strategy = "fast-forward"

# Conflict resolution: "abort", "ours", "theirs", "interactive"
conflict_resolution = "interactive"

[security]
# Authentication backend: "keyring" (recommended) or "encrypted-file"
auth_backend = "keyring"

# Enable audit logging
audit_log = true

# Encrypt local config
encrypt_config = true

[daemon]
# Background sync interval (e.g., "5m", "1h", "24h")
sync_interval = "1h"

# Enable webhook server
webhook_enabled = false
webhook_port = 8080

[ui]
# Progress bar style: "bar", "spinner", "quiet"
progress_style = "bar"

# Color output
color = "auto"  # "auto", "always", "never"

# Show notifications
notifications = true

[remotes.github]
username = "your-username"
enabled = true
# Optional: Custom API URL for GitHub Enterprise
# api_url = "https://github.company.com"

[remotes.gitlab]
username = "your-username"
api_url = "https://gitlab.com"
enabled = true

[remotes.bitbucket]
username = "your-username"
enabled = false

[remotes.codeberg]
username = "your-username"
enabled = true

[remotes.mygitea]
username = "your-username"
api_url = "https://gitea.example.com"
enabled = true

πŸŽ›οΈ Configuration Commands

# View current configuration
mg config show

# Set a configuration value
mg config set sync.strategy rebase

# Edit configuration in your default editor
mg config edit

# Validate configuration
mg config validate

# Reset to defaults
mg config reset

πŸ”’ Security

πŸ›‘οΈ Security is our top priority. Your credentials are never compromised.

πŸ” Credential Management

  • OS Keyring Integration πŸ”‘

    • macOS: Keychain
    • Windows: Credential Manager
    • Linux: Secret Service / gnome-keyring
  • Encrypted Fallback πŸ”’

    • Age encryption when keyring unavailable
    • Password-protected local storage
    • AES-256 encryption standard

πŸ›‘οΈ Security Features

  • Host-Bound Credentials 🌐

    • Credentials scoped to specific hosts
    • Prevents confused-deputy attacks
    • Automatic migration from legacy keys
  • HTTPS Enforcement πŸ”’

    • HTTP URLs rejected by default
    • Opt-in for insecure connections
    • Protects against MitM attacks
  • Zero Plain Text 🚫

    • No tokens in config files
    • Environment tokens opt-in only
    • Memory wiping after use
  • Secret Redaction πŸ›‘οΈ

    • Automatic log sanitization
    • Masks tokens, passwords, keys
    • Safe daemon output logging
  • Audit Logging πŸ“

    • Track all sensitive operations
    • Credential access monitoring
    • Configurable log retention

πŸ”‘ Setting Up Credentials

# Add credentials interactively (recommended)
mg remote add github username
# πŸ” You'll be prompted for your Personal Access Token
# βœ“ Token encrypted and stored in OS keyring
# βœ“ Never appears in plain text

# Verify credential storage
mg config show --security

πŸ”’ Security Best Practices

βœ…

Use PATs
Personal Access Tokens, not passwords

πŸ”„

Rotate Regularly
Update tokens periodically

🎯

Minimal Scope
Grant only needed permissions

πŸ“‹

Audit Logs
Review security logs regularly

🚨 Security Reporting

Found a security vulnerability? Please DO NOT open a public issue. Instead:

  • πŸ“§ Email: security@tiverse.dev
  • πŸ”’ Use GitHub Security Advisory
  • ⏱️ We'll respond within 24-48 hours

πŸ—οΈ Architecture

MultiGit follows a clean, modular architecture designed for extensibility and maintainability:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Frontend Layer                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚   CLI    β”‚  β”‚   TUI    β”‚  β”‚ Daemon   β”‚  β”‚  API    β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Core Engine                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ Sync Manager β”‚  β”‚  Conflict   β”‚  β”‚   Scheduler    β”‚ β”‚
β”‚  β”‚              β”‚  β”‚  Resolver   β”‚  β”‚                β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Platform Adapters                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ GitHub β”‚  β”‚ GitLab β”‚  β”‚Bitbucket β”‚  β”‚Gitea/Forge β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚            Git Operations Layer                          β”‚
β”‚              (libgit2 wrapper)                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Clone β”‚  β”‚ Push β”‚  β”‚ Pull  β”‚  β”‚ Conflict Detect β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🧩 Component Details

Frontend Layer

  • CLI commands
  • Interactive TUI
  • Daemon service
  • REST API (planned)

Core Engine

  • Sync orchestration
  • Conflict detection
  • Job scheduling
  • State management

Platform Adapters

  • GitHub API
  • GitLab API
  • Bitbucket API
  • Gitea/Forgejo API

Git Layer

  • libgit2 wrapper
  • Repository ops
  • Credential mgmt
  • Network transport

🀝 Contributing

We ❀️ contributions! Whether you're fixing bugs, adding features, or improving docs, we welcome your help.

Contributors

πŸš€ Quick Start for Contributors

1️⃣ Fork & Clone

git clone https://github.com/YOUR_USERNAME/multigit.git
cd multigit

2️⃣ Create Branch

git checkout -b feature/amazing-feature

3️⃣ Make Changes

# Make your changes
cargo test
cargo fmt
# 4️⃣ Commit with conventional commits
git commit -m 'feat: add amazing feature'

# 5️⃣ Push and create PR
git push origin feature/amazing-feature

πŸ“‹ Contribution Guidelines

  • πŸ“– Read our Contributing Guide for detailed guidelines
  • βœ… Ensure all tests pass: cargo test
  • 🎨 Format your code: cargo fmt
  • πŸ” Run linter: cargo clippy
  • πŸ“ Update documentation if needed
  • βœ‰οΈ Use Conventional Commits

🎯 Areas We Need Help

πŸ›

Bug Fixes
Help squash bugs

πŸ“š

Documentation
Improve our docs

🎨

UI/UX
Better user experience

πŸ§ͺ

Testing
More test coverage

πŸ“ Development Status & Roadmap

πŸŽ‰ Current Release: v2.0.0

GitHub release Release Date Commits since release

βœ… Completed Features

Core Functionality

  • βœ… Multi-remote synchronization
  • βœ… Smart conflict detection & resolution
  • βœ… Parallel async operations
  • βœ… OS keyring integration
  • βœ… Encrypted credential storage
  • βœ… Interactive CLI/TUI

Advanced Features

  • βœ… Daemon mode with scheduler
  • βœ… Conventional commits wizard
  • βœ… Health check & diagnostics
  • βœ… Comprehensive test suite (58+ tests)
  • βœ… Cross-platform support
  • βœ… Rich documentation

πŸš€ Roadmap

Version Features Status
v2.1.0 TUI Dashboard, Interactive status viewer 🚧 In Progress
v2.2.0 Git LFS support, Submodule sync πŸ“‹ Planned
v2.3.0 Workspace management (multi-repo) πŸ“‹ Planned
v3.0.0 Webhook server, GUI with Tauri πŸ’­ Future
View Detailed Roadmap

v2.1.0 - Enhanced UI (Q1 2025)

  • Full-screen TUI dashboard with ratatui
  • Real-time sync monitoring
  • Interactive conflict resolution UI
  • Customizable themes

v2.2.0 - Advanced Git Features (Q2 2025)

  • Git LFS support for large files
  • Submodule synchronization
  • Partial clone support
  • Shallow clone optimization

v2.3.0 - Workspace Management (Q3 2025)

  • Multi-repository workspaces
  • Bulk operations across repos
  • Workspace templates
  • Dependency graph visualization

v3.0.0 - Integration & GUI (Q4 2025)

  • Webhook server for push events
  • REST API for integrations
  • Native GUI application with Tauri
  • Plugin system

πŸ“Š Project Stats

Code Size Lines of Code Commit Activity Last Commit

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ“š Examples

Check out the examples/ directory for complete working examples:

Run examples with:

cargo run --example basic_usage
cargo run --example scheduler_example
cargo run --example ui_formatting

πŸ“‹ Quick Command Reference

Category Command Description
Setup mg init Initialize MultiGit in repository
mg remote add <platform> <user> Add a new remote platform
Sync mg sync Bidirectional sync all remotes
mg push Push to all remotes
mg pull Pull from primary remote
mg status Check sync status
Commits mg cc Interactive conventional commit
mg commit Alias for cc
Daemon mg daemon start --interval 1h Start background sync daemon
mg daemon status Check daemon status
mg daemon stop Stop daemon
Config mg config show View current configuration
mg config edit Edit configuration
Health mg doctor Run health diagnostics
mg doctor --fix Auto-fix common issues
Conflicts mg conflict list List all conflicts
mg conflict resolve Resolve conflicts interactively

πŸ’Ύ Platform Support Matrix

OS Architecture Status Download
🐧 Linux x86_64 βœ… Supported Download
🐧 Linux aarch64 (ARM) βœ… Supported Download
🍎 macOS Intel (x86_64) βœ… Supported Download
🍎 macOS Apple Silicon (M1/M2) βœ… Supported Download
πŸͺŸ Windows x86_64 βœ… Supported Download
πŸͺŸ Windows ARM64 🚧 Coming Soon -

🎯 Use Cases

Open Source Maintainers

  • Mirror repositories across GitHub, GitLab, and self-hosted platforms
  • Ensure availability if one platform goes down
  • Reach wider audiences on different platforms

Enterprise Teams

  • Maintain internal GitLab and external GitHub repos in sync
  • Backup to multiple locations automatically
  • Comply with data residency requirements

Individual Developers

  • Keep personal and work accounts synchronized
  • Showcase work on multiple platforms for visibility
  • Automatic backups with daemon mode

CI/CD Pipelines

  • Deploy to multiple hosting platforms from one source
  • Test across different Git hosting APIs
  • Automated synchronization in workflows

βš–οΈ Comparison with Alternatives

Feature MultiGit Shell Scripts Git Aliases Manual Sync
Multi-remote push βœ… One command ⚠️ Custom script ⚠️ Per-remote ❌ Very tedious
Conflict detection βœ… Automatic ❌ Manual ❌ Manual ❌ Manual
Secure credentials βœ… OS keyring ⚠️ Often plain text ⚠️ Git config ⚠️ Various
Progress tracking βœ… Real-time UI ❌ No ❌ No ❌ No
Daemon mode βœ… Built-in ⚠️ Via cron ❌ No ❌ No
Cross-platform βœ… Native binaries ⚠️ Shell dependent βœ… Yes βœ… Yes
API support βœ… All major platforms ⚠️ Manual setup ❌ No ❌ No
Error recovery βœ… Automatic retry ⚠️ Manual ❌ No ❌ No
Conventional commits βœ… Interactive wizard ❌ No ❌ No ⚠️ Manual
Configuration βœ… TOML + CLI ⚠️ Hard-coded ⚠️ Git config N/A

Why Choose MultiGit?

🎯 Purpose-Built

Unlike generic scripts, MultiGit is designed specifically for multi-remote sync with robust error handling and conflict resolution.

πŸ”’ Security First

Native OS keyring support means your credentials are never stored in plain text or version control.

⚑ Performance

Parallel async operations make syncing multiple remotes faster than sequential git commands.

❓ FAQ

How is this different from git remote add?

Git's native remote support requires you to push/pull each remote individually. MultiGit:

  • Pushes to all remotes with one command
  • Detects and resolves conflicts automatically
  • Manages authentication securely
  • Provides daemon mode for automatic syncing
  • Offers rich CLI/TUI experience
Does MultiGit work with private repositories?

Yes! MultiGit fully supports private repositories on all platforms. You'll need to provide a Personal Access Token (PAT) with appropriate permissions when adding a remote.

Can I use MultiGit in CI/CD pipelines?

Absolutely! MultiGit is designed for automation:

# Example GitHub Actions workflow
- name: Sync to GitLab
  run: |
    mg init
    mg remote add gitlab ${{ secrets.GITLAB_USERNAME }}
    mg push --to gitlab
How does MultiGit handle merge conflicts?

MultiGit provides three conflict resolution modes:

  1. Interactive (default) - Prompts you to resolve conflicts
  2. Abort - Stops sync and preserves current state
  3. Strategic - Use --strategy ours/theirs to auto-resolve

You can configure the default behavior in your config file.

Is my authentication information secure?

Yes! MultiGit uses:

  • OS Keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service)
  • Age Encryption as fallback
  • Zero plain text - Never stores credentials in files
Can I sync only specific branches?

Yes! Use the --branch flag:

mg sync --branch main
mg push --branch develop --to github
What happens if one remote fails?

MultiGit continues syncing to other remotes and reports which operations succeeded/failed. You can review errors and retry with mg sync --retry.

Does MultiGit support Git LFS?

Git LFS support is planned for v2.0.0. Follow issue #XX for updates.

Can I use this with monorepos or workspaces?

Single-repo support is stable in v2.0.0. Workspace management for multiple repositories is coming in a future release.

How do I report bugs or request features?

We love feedback! Please:

πŸ™ Acknowledgments

MultiGit stands on the shoulders of giants:

  • πŸ¦€ Built with Rust - Performance and safety
  • πŸ“š Git operations powered by libgit2 - Robust Git internals
  • 🎨 Terminal UI with ratatui - Beautiful TUI
  • ⚑ Async runtime by Tokio - Blazing fast concurrency
  • 🎯 CLI framework with clap - Powerful argument parsing
  • πŸ” Secure storage with keyring - OS-native credentials

πŸ“§ Support & Community

πŸ’¬ Get Help

Bug Report
Report Bugs
Feature Request
Request Features
Discussions
Join Discussions
Documentation
Read Docs

⭐ Star History

Star History Chart


πŸŽ‰ Show Your Support

If MultiGit has helped you, please consider:

⭐ Starring this repository to show your support
🐦 Sharing it with your network
🀝 Contributing to make it even better
β˜• Sponsoring the project (coming soon)


Made with Rust Built with Love Open Source

Made with ❀️ by the TIVerse Team

Β© 2024 TIVerse. Licensed under MIT.

About

A cross-platform Git multi-remote synchronization tool built in Rust. Push, pull, and sync your code across multiple Git hosting platforms (GitHub, GitLab, Bitbucket, Codeberg, Gitea/Forgejo) with a single command.

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •