Git Forge Operator – a unified CLI for GitHub, GitLab, and more
Project description
gfo – Git Forge Operator
A CLI tool to operate multiple Git hosting services with a unified command interface.
- Operate 9 services with the same commands (GitHub, GitLab, Bitbucket, Azure DevOps, Backlog, Gitea, Forgejo, Gogs, GitBucket)
- Auto-detects the service from remote URL
- Depends only on
requests— lightweight - Supports
table/json/plainoutput formats
Supported Services
| Service | Identifier | Auth Environment Variable |
|---|---|---|
| GitHub | github |
GITHUB_TOKEN |
| GitLab | gitlab |
GITLAB_TOKEN |
| Bitbucket Cloud | bitbucket |
BITBUCKET_TOKEN (email:api-token format) |
| Azure DevOps | azure-devops |
AZURE_DEVOPS_PAT |
| Gitea | gitea |
GITEA_TOKEN |
| Forgejo | forgejo |
GITEA_TOKEN |
| Gogs | gogs |
GITEA_TOKEN |
| GitBucket | gitbucket |
GITBUCKET_TOKEN |
| Backlog | backlog |
BACKLOG_API_KEY |
Installation
pip install gfo
Requirements: Python 3.11 or later
Quick Start
# 1. Initialize in your repository (auto-detects service from remote URL)
gfo init
# 2. Set up authentication token
gfo auth login
# 3. List pull requests
gfo pr list
# 4. Create an issue
gfo issue create --title "Bug report"
# 5. Clone a repository
gfo repo clone alice/my-project
Authentication
Token resolution order:
credentials.toml(saved viagfo auth login)- Service-specific environment variables (see table above)
GFO_TOKENgeneric environment variable (fallback for all services)
File paths:
- Windows:
%APPDATA%\gfo\credentials.toml - Linux / macOS:
~/.config/gfo/credentials.toml
# Set token interactively
gfo auth login --host github.com
# Set via environment variable
export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx
# Check authentication status
gfo auth status
See docs/authentication.md for token creation instructions for each service (required scopes/permissions).
Commands
| Command | Subcommands | Description |
|---|---|---|
gfo init |
— | Initialize project configuration |
gfo auth |
login, status |
Save token / check auth status |
gfo pr |
list, create, view, merge, close, checkout, update |
Pull request operations |
gfo issue |
list, create, view, close, delete, update |
Issue operations |
gfo repo |
list, create, clone, view, delete, fork |
Repository operations |
gfo release |
list, create, delete |
Release management |
gfo label |
list, create, delete |
Label management |
gfo milestone |
list, create, delete |
Milestone management |
gfo comment |
list, create, update, delete |
PR / Issue comment operations |
gfo review |
list, create |
PR review operations |
gfo branch |
list, create, delete |
Branch operations |
gfo tag |
list, create, delete |
Tag operations |
gfo status |
list, create |
Commit status operations |
gfo file |
get, put, delete |
Repository file operations |
gfo webhook |
list, create, delete |
Webhook management |
gfo deploy-key |
list, create, delete |
Deploy key management |
gfo collaborator |
list, add, remove |
Collaborator management |
gfo ci |
list, view, cancel |
CI/CD job operations |
gfo user |
whoami |
Display authenticated user info |
gfo search |
repos, issues |
Search repositories / issues |
gfo wiki |
list, view, create, update, delete |
Wiki operations |
See docs/commands.md for detailed options and examples for each command.
Global Options
| Option | Description | Default |
|---|---|---|
--format {table,json,plain} |
Output format | table |
--version |
Show version | — |
Configuration
gfo resolves configuration in 3 layers (in order of priority):
git config --local(per-repository, saved bygfo init)~/.config/gfo/config.toml(global)- Auto-detection from remote URL
config.toml example:
[defaults]
output = "table" # Default output format (table / json / plain)
host = "github.com" # Default host (optional)
[hosts."gitea.example.com"]
type = "gitea"
api_url = "https://gitea.example.com/api/v1"
[hosts."gitlab.example.com"]
type = "gitlab"
api_url = "https://gitlab.example.com/api/v4"
File paths:
- Windows:
%APPDATA%\gfo\config.toml - Linux / macOS:
~/.config/gfo/config.toml
Feature Support Matrix
| Feature | GitHub | GitLab | Bitbucket | Azure DevOps | Backlog | Gitea | Forgejo | Gogs | GitBucket |
|---|---|---|---|---|---|---|---|---|---|
| PR / MR | ○ | ○ | ○ | ○ | ○ | ○ | ○ | × | ○ |
| PR Merge | ○ | ○ | ○ | ○ | × | ○ | ○ | × | ○ |
| Issue | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| Release | ○ | ○ | × | × | × | ○ | ○ | × | ○ |
| Label | ○ | ○ | × | × | × | ○ | ○ | × | ○ |
| Milestone | ○ | ○ | × | × | × | ○ | ○ | × | ○ |
| Review | ○ | ○ | × | × | × | × | × | × | × |
| Wiki | × | ○ | × | × | × | ○ | ○ | × | × |
| CI/CD | ○ | ○ | × | × | × | ○ | ○ | × | × |
| Search | ○ | ○ | × | × | × | × | × | × | × |
×: Not supported (returns
NotSupportedError)
Development
# Run tests (with coverage)
pytest
# Run specific tests
pytest tests/test_commands/test_pr.py
Integration Tests
Integration tests against real services are also available.
- Self-hosted (Gitea / Forgejo / Gogs / GitBucket): Can run automatically with Docker
- SaaS (GitHub / GitLab / Bitbucket / Azure DevOps): Requires accounts and API tokens for each service
See docs/integration-testing.md for detailed setup instructions.
# Self-hosted tests (auto Docker startup and cleanup)
bash tests/integration/run_selfhosted.sh
# SaaS tests (set tokens in .env first)
bash tests/integration/run_saas.sh
Contributing
This project is provided under the 0BSD license. Issues may be filed, but responses and fixes are not guaranteed. Pull requests are not accepted. Feel free to fork and use it as you wish.
Changelog
See CHANGELOG.md.
License
0BSD
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gfo-0.1.1.tar.gz.
File metadata
- Download URL: gfo-0.1.1.tar.gz
- Upload date:
- Size: 263.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ebc8b35c9024da77f8a4a806832764f3efba031c68324adf75d20c7e224700d
|
|
| MD5 |
bf999549897ccb0d3d3ad23502c2d580
|
|
| BLAKE2b-256 |
7624210051a02c5732455811c03090d85012589f761a64054a0e1731779fcce4
|
File details
Details for the file gfo-0.1.1-py3-none-any.whl.
File metadata
- Download URL: gfo-0.1.1-py3-none-any.whl
- Upload date:
- Size: 89.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07a4952a23cb24850976e067df7b870752cfbe8eaf2794840f53b702783732fc
|
|
| MD5 |
42ae0eb86693639a320bc951c99caa14
|
|
| BLAKE2b-256 |
5c9580d25a0b950ebf6a776403e45b70deb1ad57fe11bd85bf3304451a3367c5
|