![]() |
2 days ago | |
---|---|---|
core | 2 days ago | |
providers | 2 days ago | |
ui | 2 days ago | |
.gitignore | 2 days ago | |
ARCHITECTURE.md | 2 days ago | |
README.md | 2 days ago | |
main.py | 2 days ago | |
requirements.txt | 2 days ago | |
run.sh | 2 days ago |
README.md
🚀 Multi-Provider Git Migration Tool
This project provides a practical and modular tool to automatically migrate your repositories between different Git providers.
✨ Features
- Multi-provider migration: Supports multiple source and destination providers
- Supported providers:
- Sources: Gitea, GitLab
- Destinations: GitHub, GitLab
- Interactive mode by default: Elegant interface to select/deselect repositories to migrate
- Complete vision: See all accessible repositories (your repos + those from organizations)
- Smart selection: Your repositories are pre-selected, others are deselected by default
- Smart renaming: Ability to rename repositories during migration
- Selective migration: Choose specifically which repositories to migrate via command line
- Command line interface: Colorful and intuitive interface with keyboard navigation
- Complete logging: Detailed operation tracking with log file
- Error handling: Robust with graceful error management
- Extensible architecture: Easily extensible to add new providers
🛠 Installation
- Clone the repository:
git clone https://github.com/your-username/GitMigrator.git
cd GitMigrator
- Automatic configuration:
./run.sh --setup
The script will automatically:
- Create a Python virtual environment
- Install all dependencies
- Create the
.env
configuration file
This will create a .env
file that you will need to fill with your information according to the chosen providers.
🔧 Configuration
Configuration with multi-instance support
# Gitea Source Configuration
GITEA_SOURCE_URL=https://your-gitea-source-instance.com
GITEA_SOURCE_TOKEN=your_gitea_source_token
GITEA_SOURCE_USERNAME=your_gitea_source_username
# Gitea Destination Configuration
GITEA_DEST_URL=https://your-gitea-dest-instance.com
GITEA_DEST_TOKEN=your_gitea_dest_token
GITEA_DEST_USERNAME=your_gitea_dest_username
# GitLab Source Configuration
GITLAB_SOURCE_URL=https://gitlab-source.com
GITLAB_SOURCE_TOKEN=your_gitlab_source_token
GITLAB_SOURCE_USERNAME=your_gitlab_source_username
# GitLab Destination Configuration
GITLAB_DEST_URL=https://gitlab-dest.com
GITLAB_DEST_TOKEN=your_gitlab_dest_token
GITLAB_DEST_USERNAME=your_gitlab_dest_username
# GitHub Configuration (same for source and destination - only one instance)
GITHUB_TOKEN=your_github_token
GITHUB_USERNAME=your_github_username
📝 Instructions:
- Multi-instances: You can configure different instances of the same provider
- Same instance: Use the same credentials for source and destination if it's the same instance
- Flexible migration: Supports GitLab → GitLab, Gitea → Gitea, etc. between different instances
- Minimal configuration: Configure only the source/destination providers that you use
- The tool will interactively ask which provider to use as source and destination
🔑 Token Configuration
Gitea Token
- Go to Settings → Applications → Generate New Token
- Give the token a name and select permissions:
repo
(full access to repositories)user
(access to user information)
GitLab Token
- Go to Settings → Access Tokens or User Settings → Access Tokens
- Create a Personal Access Token with permissions:
read_api
(read API information)read_repository
(read repositories)write_repository
(write repositories - for destination)
GitHub Token
- Go to Settings → Developer settings → Personal access tokens → Tokens (classic)
- Click on Generate new token (classic)
- Select permissions:
repo
(full access to private repositories)public_repo
(access to public repositories)
🚀 Usage
After configuring your tokens in the .env
file, use the launch script:
Interactive migration (default)
./run.sh
Automatic migration of all your repos
./run.sh --no-interactive
Migration of specific repositories
./run.sh --repos my-repo another-repo
List available repositories
./run.sh --list
Verbose mode (more details)
./run.sh --verbose
💡 Alternative: You can also use
python main.py
directly if you have activated the virtual environment (source venv/bin/activate
)
🎯 Interactive Mode
Interactive mode (enabled by default) offers an elegant user interface to precisely select which repositories to migrate:
./run.sh # Interactive mode by default
Controls in the interactive interface:
- ↑↓: Navigate between repositories
- ←→: Change page (if many repos)
- SPACE: Check/uncheck a repository
- A: Select all repositories
- N: Deselect all repositories
- ENTER: Confirm selection and proceed to renaming (optional)
- Q: Quit without migrating
Renaming interface:
After selection, the tool offers to rename repositories:
- Y: Open renaming interface
- N/ENTER: Keep current names
- Automatic validation of repository names for the destination provider
Features:
- ✅ Visual checkboxes with emojis
- 👤 Owner distinction: Your repos vs other users' repos
- 🎯 Smart selection: Your repos pre-selected by default
- 📋 Smart sorting: Your repos first, then others, all alphabetically ordered
- ✏️ Optional renaming: Ability to rename repos on the destination provider
- 📄 Automatic pagination (15 repos per page)
- 🎨 Colorful interface with highlighting and visual separators
- 📊 Real-time counter of selected repos
- 🔒 Visual indicators (private/public)
- 📝 Truncated descriptions for clean display
📋 Usage Examples
Example 1: Interactive migration (default)
# 1. Configure your providers in .env
# 2. Launch the tool
./run.sh
# The tool will ask you:
# - Which provider to use as source
# - Which provider to use as destination
# - Then you can select repos to migrate
Example 2: Automatic migration
# Migrate all your repositories automatically
# (after interactive provider selection)
./run.sh --no-interactive
Example 3: Selective migration
# Migrate only specified repositories
# (after interactive provider selection)
./run.sh --repos web-project api-backend
Example 4: Migration from an organization
# Migrate a repository from an organization (works with all providers)
./run.sh --repos my-org/important-project
Example 5: First launch (configuration)
# 1. Initial setup - creates .env template file
./run.sh --setup
# 2. Edit the .env file with your credentials (at least 2 providers)
nano .env
# 3. Launch the tool - it will ask which providers to use
./run.sh
# 4. To list available repos (after source provider selection)
./run.sh --list
Example 6: Migration with renaming
# 1. Launch interactive mode
./run.sh
# 2. Select source and destination providers
# 3. Select repos to migrate
# 4. Choose "Y" for renaming
# 5. Rename repos one by one
# - Press ENTER to keep original name
# - Type new name to rename
# 6. Confirm and start migration
📊 Results
The tool displays a detailed summary at the end:
- ✅ Number of successful migrations
- ❌ Number of failed migrations
- 📝 Detail per repository
All logs are also saved in migration.log
.
🔧 Project Structure
GitMigrator/
├── main.py # Main script
├── core/ # Core business logic
│ ├── config.py # Multi-provider configuration management
│ └── migration_engine.py # Migration engine
├── providers/ # Providers for different Git services
│ ├── base.py # Abstract classes and models
│ ├── factory.py # Factory to create providers
│ ├── source/ # Source providers
│ │ ├── gitea.py # Gitea support
│ │ └── gitlab.py # GitLab support
│ └── destination/ # Destination providers
│ ├── github.py # GitHub support
│ └── gitlab.py # GitLab support
├── ui/ # User interface
│ └── interactive_selector.py
├── requirements.txt # Python dependencies
├── .env # Configuration (to create)
└── README.md # Documentation
🌟 Supported Providers
Source Providers
- Gitea: Gitea instances (self-hosted or cloud)
- GitLab: GitLab.com or self-hosted GitLab instances
Destination Providers
- GitHub: GitHub.com
- GitLab: GitLab.com or self-hosted GitLab instances
Possible Combinations
- Gitea → GitHub
- Gitea → GitLab
- GitLab → GitHub
- GitLab → GitLab (migration between instances)
⚠️ Prerequisites
- Python 3.7+
- Git installed on your system
- Access to source and destination provider APIs
- Valid authentication tokens for providers
🛡 Security
- Tokens are stored in a
.env
file (add it to.gitignore
) - Authentication URLs are never logged
- Automatic cleanup of temporary repositories
🐛 Troubleshooting
Authentication error
- Check that your tokens are valid and have the right permissions
- Make sure usernames match
- Verify that provider URLs are correct
Clone error
- Check your internet connection
- Make sure Git is installed and accessible
Repository already exists
- The tool automatically checks existence on the destination provider
- Existing repositories are ignored with a warning
Unsupported or unconfigured provider
- Check that your providers are properly configured in the .env file
- Make sure you have at least 2 providers configured
- Available providers: gitea, gitlab, github
- The tool will indicate which providers are configured at startup
📝 Logs
All execution details are saved in migration.log
:
- Operation timestamps
- Source and destination provider selection
- Error details
- Migration statistics
- Complete information about the migration process
🚀 Extensibility
The modular architecture allows easy addition of new providers:
- Create a new source provider in
providers/source/
- Create a new destination provider in
providers/destination/
- Register the provider in
providers/factory.py
- Add configuration in
core/config.py
See ARCHITECTURE.md
for more details on adding new providers.
🤝 Contribution
Contributions are welcome! Feel free to:
- Report bugs
- Suggest improvements
- Submit pull requests
- Add new providers
📄 License
This project is under MIT license. See the LICENSE file for more details.