A fast and intuitive git profile switcher written in Rust, with support for SSH keys, HTTPS credentials, and both global and local configurations.
- 🚀 Fast - Written in Rust for blazing-fast profile switching
- 🔑 SSH Support - Manage different SSH keys for different profiles
- 🌐 Multi-scope - Switch profiles globally or per-repository
- 🎨 User-friendly - Intuitive CLI with colored output
- 🔒 Secure - HTTPS credentials can be stored in the system keychain
- 🤖 Auto-switching - Automatically switch profiles based on repo URL (coming soon)
cargo install gitp
# Make sure you have Rust installed
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Clone and install
git clone https://github.com/created-by-varun/gitp.git
cd gitp
cargo install --path .
-
Create a profile:
# Enter interactive mode gitp new work # Or with flags gitp new personal --email "me@example.com" --name "John Doe"
-
List profiles:
gitp list
-
Switch profiles:
# Switch globally gitp use work # Switch for current repo only gitp use personal --local
-
Check current profile:
gitp
# Create a new profile interactively
gitp new <profile-name> --interactive
# Create with specific settings
gitp new work \
--name "John Doe" \
--email "john@company.com" \
--ssh-key ~/.ssh/id_rsa_work
# Show profile details
gitp show work
# Edit existing profile
gitp edit work # Opens interactive mode
# Edit specific fields, including HTTPS credentials:
gitp edit work \
--https-host github.com \
--https-username myuser \
--https-token "ghp_xxxxxxxxxxxxxxxxxxxx" \
--https-store-in-keychain # Store the token in system keychain
# Remove HTTPS credentials from a profile (and keychain if stored there):
gitp edit work --https-remove-credentials
# Remove a profile
gitp remove work
# Rename a profile
gitp rename work work-backup
# Switch globally (default)
gitp use personal
# Switch for current repository only
gitp use work --local
# Show current profile
gitp current
gitp current --show-config # With full configuration
Profiles are stored in ~/.config/gitp/config.toml
:
current_profile = "work"
[profiles.work]
name = "John Doe"
email = "john@company.com"
ssh_key = "~/.ssh/id_rsa_work"
gpg_key = "ABCD1234"
[profiles.personal]
name = "John Doe"
email = "john@personal.com"
ssh_key = "~/.ssh/id_rsa_personal"
- Basic profile management (create, list, switch, remove)
- Global git config switching
- SSH key management and SSH config generation
- Local (per-repository) profile switching
- HTTPS credential management via system keychain
- Auto-switching based on repository URLs
- Profile templates and inheritance
- Import/export profiles
- Shell prompt integration
- Homebrew formula and AUR package
gitp/
├── src/
│ ├── main.rs # Entry point
│ ├── cli.rs # CLI definitions
│ ├── commands/ # Command implementations
│ ├── config/ # Configuration management
│ ├── credentials/ # Credential management (keychain, tokens)
│ ├── git/ # Git operations
│ ├── ssh/ # SSH configuration management
│ └── utils/ # Utilities
├── tests/ # Integration tests
└── Cargo.toml
# Debug build
cargo build
# Release build
cargo build --release
# Run tests
cargo test
# Run with verbose output
cargo run -- --verbose list
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
This project is licensed under the MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT).
- Inspired by various git profile switchers in the ecosystem
- Built with excellent Rust crates: clap, serde, git2, and more