Cherry-pick files and folders from multiple GitHub repos. Auto-sync upstream changes. Compose unified projects β zero manual effort.
The Problem Β· How It Works Β· Use Cases Β· Quick Start Β· API
You're building an AI agent. The best skills, tools, and reference docs are scattered across 6 different GitHub repos from different authors. You need specific folders from each β not the whole repo.
Without GitManager:
1. git clone repo-A β manual
2. cp repo-A/skills/pytorch β manual
3. git clone repo-B β manual
4. cp repo-B/skills/security β manual
5. Repeat for 6 repos... β tedious
6. repo-A updates pytorch skill β you never know
7. Your agent uses stale code β broken
With GitManager:
Configure once β Auto-pull 6 repos β Cherry-pick 35 paths β Auto-commit & push β Repeat on schedule
Upstream fixes a bug? Your project inherits it automatically. You remove a skill? GitManager deletes it from your repo and git history. All from a dashboard. No terminal needed.
flowchart LR
subgraph Upstreams["Upstream Repos (GitHub)"]
A["claude-skills"]
B["chart-viz-skills"]
C["engineering-skills"]
end
subgraph GM["GitManager"]
Pull["β git pull"]
Forward["β‘ Cherry-pick paths"]
Cleanup["β’ Orphan cleanup"]
Push["β£ git commit + push"]
end
subgraph Target["Your Project"]
Skills["skills/"]
Config["configs/"]
end
A & B & C --> Pull --> Forward --> Cleanup --> Push --> Skills & Config
| Step | What Happens |
|---|---|
| β Pull | Clones or pulls latest from each upstream repo |
| β‘ Forward | Copies only the folders/files you selected β not the whole repo |
| β’ Cleanup | Removes orphaned paths when you delete a forwarding rule (including git rm) |
| β£ Push | Auto-commits with smart messages and pushes to your repo |
All steps run on a configurable schedule (e.g., every 10 minutes) in background worker threads.
Aggregate skills from multiple AI skill repositories into a single unified agent:
alirezarezvani/claude-skills β skills/python-patterns
skills/pytorch-patterns
skills/security
anthropics/skills β skills/pdf
skills/docx
your-own/custom-skills β skills/my-custom-tool
Result: One repo powers your AI agent with the best skills from across the ecosystem β always up to date.
| Use Case | How |
|---|---|
| Shared Config Sync | Pull ESLint, Prettier, Dockerfile configs from a central standards repo into all your projects |
| Documentation Aggregation | Collect /docs/ from multiple microservice repos into a single documentation site |
| Design System Distribution | Sync UI components from a design system repo to multiple product repos |
| Open Source Curation | Cherry-pick utilities from open source projects without forking entire repos |
| Multi-Vendor Integration | Pull deliverables from vendor repos into your main project β auto-sync on updates |
| Feature | Description |
|---|---|
| ποΈ Multi-Project | Manage unlimited projects, each with its own upstreams, forwards, and schedule |
| π Live Upstream Sync | Auto-pull or clone upstream repos β always track the latest changes |
| π Selective Path Forwarding | Cherry-pick specific folders/files β not the whole repo |
| π§Ή Orphan Cleanup | Remove a forward rule β files are deleted from disk AND git index |
| β° Background Scheduler | Per-project sync interval with hot-reload β config changes apply instantly |
| π Smart Commits | Auto-generated commit messages grouped by upstream source |
git clone https://github.com/mdnaimul22/GitManager.git
cd GitManager
pip install -r requirements.txtcp .env.example .envGM_USERNAME=admin
GM_PASSWORD=your_secure_password
GM_SECRET_KEY=any_long_random_stringpython main.pyOpen http://localhost:8000 β that's it. π
Click + in the sidebar. Give it a name and the absolute path to your local Git repository.
For each source repository, define:
- Name β a label (e.g.,
claude-skills) - URL β the GitHub clone URL
- Branch β which branch to track (default:
main) - Path β where to clone it locally
GitManager auto-clones on first run if the path doesn't exist.
Select exactly which paths to copy from each upstream:
FROM: ~/.claude-skills/skills/python-patterns
TO: ~/my-project/skills/python-patterns
Toggle individual forwards on/off without deleting them.
Set the sync interval and click Run. The background worker handles everything automatically.
GitManager/
βββ main.py # FastAPI server + graceful shutdown
βββ src/
β βββ config/ # Settings, paths, file utilities
β βββ schema/ # Pydantic models (single source of truth)
β βββ core/
β β βββ watcher.py # Hot-reload config watcher (mtime-based)
β β βββ pool.py # Background worker pool (per-project threads)
β β βββ rate_limiter.py # Rate limiting + scanner auto-ban
β β βββ resolver.py # {REPO_ROOT} placeholder resolver
β βββ providers/
β β βββ git.py # Low-level git command wrapper
β βββ services/
β β βββ project.py # Project CRUD (thread-safe)
β β βββ upstream.py # Pull / clone upstream repos
β β βββ forward.py # Selective copy + orphan cleanup + git rm
β β βββ commit.py # Smart commit message generation
β β βββ sync.py # Full sync orchestrator
β βββ routers/
β βββ auth.py # HMAC-signed session auth
β βββ projects.py # REST API + worker control
βββ static/ # Single-page dashboard (AlpineJS + 9 themes)
βββ data/ # Per-project JSON config (gitignored)
βββ tests/ # 67 pytest tests
All endpoints require session cookie authentication.
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/auth/login |
Login with username & password |
POST |
/api/auth/logout |
Clear session |
GET |
/api/auth/check |
Validate current session |
GET |
/api/projects |
List all projects |
POST |
/api/projects |
Create a new project |
GET |
/api/projects/{id} |
Get project with full config |
PUT |
/api/projects/{id} |
Update project config |
DELETE |
/api/projects/{id} |
Delete a project |
POST |
/api/projects/{id}/run |
Start background sync worker |
POST |
/api/projects/{id}/stop |
Stop background sync worker |
pytest tests/ -v67 passed in 2.3s
Tests cover: authentication, project CRUD, worker control, rate limiting, orphan cleanup, incremental copy, hot-reload ordering, and config persistence.
- Authentication: HMAC-SHA256 signed cookies β stateless, survives restarts
- Rate Limiting: 60 req/min per IP β configurable
- Scanner Detection: Auto-bans IPs probing for
.env,.git, credentials (2 strikes β 1hr ban) - Localhost Whitelist:
127.0.0.1,::1, private subnets β prevents self-lockout - No Cloud: Runs entirely on your machine β your data never leaves
- Fork the repository
- Branch:
git checkout -b feature/your-feature - Commit: Follow conventional commits (
feat:,fix:,chore:) - Test:
pytest tests/must pass - PR: Open a Pull Request
MIT License β free to use, modify, and distribute.
Built to solve a real problem β keeping AI agents alive with the latest skills from across the ecosystem.
If this solves your problem too, give it a β on GitHub!
