feat: Add mgit intelligent Git workflow tool for Milvus development (#46970)

issue: #46969

Signed-off-by: (Checked)

Signed-off-by: xiaofanluan <xiaofan.luan@zilliz.com>
This commit is contained in:
Xiaofan 2026-01-12 16:49:32 +08:00 committed by GitHub
parent 2ea16b2f6d
commit 5fb7c4024a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 2157 additions and 0 deletions

2
.gitignore vendored
View File

@ -121,3 +121,5 @@ WARP.md
# Gocache
**/.gocache/
claude.md
docs/plans/

296
tools/README.md Normal file
View File

@ -0,0 +1,296 @@
# Milvus Development Tools
## mgit.py - Intelligent Git Workflow Tool
`mgit.py` is an intelligent Git workflow tool designed to streamline commit and PR processes for Milvus development.
### Features
- 🤖 **AI-Powered Commit Messages** - Automatically generates commit messages following Milvus conventions
- ✅ **Automatic DCO Signing** - Ensures compliance with Developer Certificate of Origin
- 🌿 **Auto Branch Creation** - Prevents commits to master, creates feature branches automatically
- 🔄 **Complete PR Workflow** - fork → branch → commit → issue → PR → cherry-pick
- 🛠️ **Code Formatting** - Runs local format tools before commit
- 📝 **Interactive Controls** - Flexible step-by-step workflow
### Prerequisites
1. **Install GitHub CLI**
```bash
# macOS
brew install gh
# Linux
# See: https://cli.github.com/
```
2. **Authenticate GitHub CLI**
```bash
gh auth login
```
3. **Configure AI API Key** (Optional - choose one or none)
```bash
# Gemini API (recommended)
export GEMINI_API_KEY=AIzaSy...
# Claude API
export ANTHROPIC_API_KEY=sk-ant-...
# OpenAI API
export OPENAI_API_KEY=sk-...
```
Add to `~/.bashrc` or `~/.zshrc` for persistence:
```bash
echo 'export GEMINI_API_KEY=your-key-here' >> ~/.zshrc
```
**Note:** If you have local `claude` CLI installed, the tool will use it instead of API calls.
### Usage
#### 1. Smart Commit (create commit only)
```bash
python3 tools/mgit.py --commit
```
**Workflow:**
1. Check current branch (auto-create feature branch if on master)
2. Detect unstaged files, prompt to stage
3. Run code formatting tools (optional)
4. Analyze code changes (git diff)
5. AI generates Milvus-compliant commit message
6. Review generated message with options:
- `y` Accept and commit
- `e` Edit in $EDITOR
- `r` Regenerate with AI
- `m` Manual input
- `n` Cancel
7. Auto-add DCO signature and create commit
8. Optionally run code review
**Example Output:**
```
Generated Commit Message:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
enhance: optimize planparserv2 grammar and use SLL prediction
1. Reordered 'expr' alternatives to prioritize common patterns
2. Implemented SLL-first parsing for better performance
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Options:
[y] Accept and commit
[e] Edit in $EDITOR
[r] Regenerate with AI
[m] Enter manually
[n] Cancel
```
#### 2. Create PR (assumes commits exist)
```bash
python3 tools/mgit.py --pr
```
**Workflow:**
1. Check current branch, commit count, DCO signature
2. Push to your fork (origin)
3. Create or link GitHub Issue:
- Create new issue
- Use existing issue number
- Skip (not recommended - Milvus requires issue reference)
4. Create PR to `milvus-io/milvus` with required issue reference
5. Optional: Cherry-pick to release branches (2.6, 2.5, etc.)
**Important:** All Milvus PRs must include an issue reference in the format:
```
issue: #39157
```
For cherry-pick PRs, include the original PR number:
```
issue: #39157
pr: #39200
```
#### 3. Complete Workflow (Commit + PR)
```bash
python3 tools/mgit.py --all
# or simply
python3 tools/mgit.py
```
Automatically executes: create commit → create PR.
### Setup Alias (Recommended)
Create a shell alias for convenience:
```bash
# Add to ~/.bashrc or ~/.zshrc
# Option 1: Dynamic path (works from any directory within the repo)
alias mgit='python3 "$(git rev-parse --show-toplevel)/tools/mgit.py"'
# Option 2: Fixed path (replace with your actual Milvus repo location)
# alias mgit='python3 /path/to/your/milvus/tools/mgit.py'
```
After reloading, use directly:
```bash
mgit --commit
mgit --pr
mgit # complete workflow
```
### AI-Generated Commit Message Format
Follows Milvus conventions:
**Format:** `<type>: <summary>`
**Types:**
- `fix`: Bug fixes
- `enhance`: Improvements to existing features
- `feat`: New features
- `refactor`: Code refactoring
- `test`: Add or modify tests
- `docs`: Documentation updates
- `chore`: Build/tool changes
**Requirements:**
- Title ≤ 80 characters
- Use imperative mood (e.g., "Fix bug" not "Fixed bug")
- Optional: Detailed body explanation
**Examples:**
```
fix: Fix missing handling of FlushAllMsg in recovery storage
enhance: optimize jieba and lindera analyzer clone
feat: Add semantic highlight
test: Add planparserv2 benchmarks
```
### Branch Naming Convention
When creating a new branch from master, the tool generates names in the format:
```
{type}/{description}-{timestamp}
```
**Examples:**
- `fix/memory-leak-1234`
- `feat/add-gemini-api-5678`
- `enhance/optimize-parser-9012`
### Code Formatting
Before committing, the tool offers to run Milvus format tools:
```bash
make fmt # Format Go code
make static-check # Run linters (optional)
```
You can choose to:
- Run formatting and continue
- Skip formatting
- Cancel commit
### Code Review
After committing, you can optionally run a local code review using Claude Code (if installed):
```bash
claude -p "Review the recent changes for potential issues"
```
### FAQ
**Q: What if AI API call fails?**
A: The script auto-falls back to manual input mode.
**Q: How to modify generated commit message?**
A: Choose `e` to open in $EDITOR, or `m` for manual input.
**Q: Multiple commits on branch?**
A: Milvus typically requires a single squashed commit. Tool will warn and suggest:
```bash
git rebase -i origin/master
```
**Q: Can I use without API keys?**
A: Yes, but AI generation won't be available. You'll enter messages manually.
**Q: How to test without actually committing?**
A: Choose `n` at the confirmation step.
**Q: What if I'm on master branch?**
A: The tool will prompt you to create a new feature branch automatically.
### Advanced Usage
**Stage specific files only:**
```bash
python3 tools/mgit.py --commit
# Select 's' at file selection, then enter: 0,2,5
```
**Use custom editor:**
```bash
export EDITOR=vim # or nano, emacs, etc.
python3 tools/mgit.py --commit
# Choose 'e' to edit
```
**Cherry-pick to multiple branches:**
```bash
python3 tools/mgit.py --pr
# At cherry-pick step, enter: 0,1,2
```
**Use local Claude Code instead of API:**
```bash
# If 'claude' command is available, tool will use it automatically
# No API key needed
```
### Troubleshooting
**GitHub CLI not authenticated:**
```
✗ GitHub CLI not authenticated. Run: gh auth login
```
Solution: Run `gh auth login` and follow prompts
**Git user info not configured:**
```
✗ Git user name/email not configured
```
Solution:
```bash
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
```
**API rate limit:**
Wait and retry, or switch to another AI provider (Gemini ↔ Claude ↔ OpenAI)
**Format tools not found:**
Ensure you're in the Milvus repository root, or skip formatting step
### AI Provider Priority
1. **Local Claude Code** (if `claude` CLI available) - no API needed
2. **Gemini API** (if `GEMINI_API_KEY` set)
3. **Claude API** (if `ANTHROPIC_API_KEY` set)
4. **OpenAI API** (if `OPENAI_API_KEY` set)
5. **Manual Input** (if no AI available)
### Contributing
For improvements to `mgit.py`, refer to the design document: `docs/plans/2026-01-10-mgit-design.md`

1859
tools/mgit.py Executable file

File diff suppressed because it is too large Load Diff