Initial: pi-skill — 68 skills, 43 extensions, 11 themes for Pi
This commit is contained in:
184
skills/git-split-push/README.md
Normal file
184
skills/git-split-push/README.md
Normal file
@@ -0,0 +1,184 @@
|
||||
# Git Split Push
|
||||
|
||||
**Split large git pushes into smaller batches** — no LFS required.
|
||||
|
||||
When `git push` fails with "pack exceeds maximum allowed size" or "remote end hung up unexpectedly", this tool automatically splits your changes into smaller batches and pushes them sequentially.
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# Run when push fails
|
||||
python3 ~/.claude/skills/git-split-push/scripts/batch-push.py
|
||||
|
||||
# Or add an alias
|
||||
alias git-split='python3 ~/.claude/skills/git-split-push/scripts/batch-push.py'
|
||||
git-split
|
||||
```
|
||||
|
||||
## How It Works
|
||||
|
||||
1. Detects all files that need to be pushed (staged, untracked, modified)
|
||||
2. Groups them into batches (default: 20MB per batch)
|
||||
3. Creates commits: `[split-push] Batch 1/5`
|
||||
4. Pushes each batch sequentially
|
||||
5. Reports success/failure for each batch
|
||||
|
||||
## Common Errors It Fixes
|
||||
|
||||
```
|
||||
fatal: the remote end hung up unexpectedly
|
||||
pack exceeds maximum allowed size
|
||||
RPC failed; HTTP 413
|
||||
error: packfile is too large
|
||||
413 Request Entity Too Large
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### Check Size First
|
||||
|
||||
```bash
|
||||
$ git-split --check-size
|
||||
|
||||
📊 Push Size Analysis:
|
||||
Total files: 116
|
||||
Total size: 91.2 MB
|
||||
Batches needed (at 20MB): 5
|
||||
```
|
||||
|
||||
### Dry Run (Preview)
|
||||
|
||||
```bash
|
||||
$ git-split --dry-run
|
||||
|
||||
🔍 Dry run - showing what would happen:
|
||||
|
||||
Batch 1: ✓ (18.5 MB)
|
||||
- node_modules/large-file.js (5.2 MB)
|
||||
- assets/videos/demo.mp4 (4.1 MB)
|
||||
...
|
||||
|
||||
Batch 2: ✓ (19.2 MB)
|
||||
...
|
||||
```
|
||||
|
||||
### Custom Batch Size
|
||||
|
||||
```bash
|
||||
# Use 30MB per batch (for servers with higher limits)
|
||||
git-split --max-size 30
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
| Option | Description |
|
||||
|--------|-------------|
|
||||
| `--max-size N` | Max MB per batch (default: 20) |
|
||||
| `--dry-run` | Preview batches without pushing |
|
||||
| `--check-size` | Show size analysis and exit |
|
||||
| `--untracked-only` | Only push untracked files |
|
||||
|
||||
## Files Too Large
|
||||
|
||||
If a single file exceeds the batch limit (e.g., 100MB video), it will be skipped with instructions:
|
||||
|
||||
```
|
||||
⚠️ Batch 3 SKIPPED (file too large)
|
||||
- video.mp4 (105.3 MB)
|
||||
|
||||
💡 To push this file, either:
|
||||
1. Split the file: split --bytes=40M video.mp4 part-
|
||||
2. Use Git LFS (requires server support)
|
||||
3. Remove from git: git rm --cached video.mp4
|
||||
```
|
||||
|
||||
## How Batching Works
|
||||
|
||||
Files are sorted by size (largest first) and grouped until reaching the max size:
|
||||
|
||||
```
|
||||
Files: [50MB, 30MB, 20MB, 15MB, 10MB, 8MB, 5MB, 3MB, 2MB]
|
||||
Max batch: 20MB
|
||||
|
||||
Batch 1: [50MB] ← single file too large, skipped
|
||||
Batch 2: [30MB] ← single file too large, skipped
|
||||
Batch 3: [20MB] ← 20MB exactly
|
||||
Batch 4: [15MB, 3MB] ← 18MB total
|
||||
Batch 5: [10MB, 8MB] ← 18MB total
|
||||
Batch 6: [5MB, 2MB] ← 7MB total
|
||||
```
|
||||
|
||||
Skipped files (those exceeding `--max-size`) need manual handling.
|
||||
|
||||
## Why Not LFS?
|
||||
|
||||
Git LFS requires:
|
||||
- Server support (Gitea/GitHub/GitLab)
|
||||
- Additional setup
|
||||
- Separate storage quotas
|
||||
|
||||
This tool works with **any git server** without configuration.
|
||||
|
||||
## Safety Features
|
||||
|
||||
- ✅ Never loses your work
|
||||
- ✅ Soft reset on push failure
|
||||
- ✅ Per-batch commits (can cherry-pick)
|
||||
- ✅ Dry run mode (preview first)
|
||||
|
||||
## Requirements
|
||||
|
||||
- Python 3.6+
|
||||
- Git (obviously)
|
||||
|
||||
## Install
|
||||
|
||||
The skill is already installed. To use from anywhere, add to your shell config:
|
||||
|
||||
```bash
|
||||
# ~/.bashrc or ~/.zshrc
|
||||
export PATH="$HOME/.claude/skills/git-split-push/scripts:$PATH"
|
||||
```
|
||||
|
||||
Or create an alias:
|
||||
|
||||
```bash
|
||||
alias git-split='python3 ~/.claude/skills/git-split-push/scripts/batch-push.py'
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Not in a git repository"
|
||||
|
||||
Make sure you're in a directory with a `.git` folder:
|
||||
|
||||
```bash
|
||||
cd ~/projects/my-repo
|
||||
git-split
|
||||
```
|
||||
|
||||
### "Could not determine current branch"
|
||||
|
||||
Make sure you have an active branch:
|
||||
|
||||
```bash
|
||||
git checkout main # or master, develop, etc.
|
||||
git-split
|
||||
```
|
||||
|
||||
### Push still failing after split
|
||||
|
||||
The server may have a lower limit. Try smaller batches:
|
||||
|
||||
```bash
|
||||
git-split --max-size 10 # 10MB per batch
|
||||
```
|
||||
|
||||
### All batches fail
|
||||
|
||||
Check your network connection and remote URL:
|
||||
|
||||
```bash
|
||||
git remote -v
|
||||
git push -u origin main # verify credentials work
|
||||
```
|
||||
Reference in New Issue
Block a user