mirror of
https://github.com/imjasonh/infinite-git
synced 2026-07-08 17:15:37 +00:00
This server generates a new commit every time someone pulls from it. Features: - Pure Go implementation of Git object format and protocols - No dependency on git CLI commands - Thread-safe commit generation - Read-only Git HTTP smart protocol support - Comprehensive test suite Each pull creates a new commit with a unique file containing a timestamp and counter, making the repository grow infinitely with each pull operation. Co-Authored-By: Claude <noreply@anthropic.com>
1.8 KiB
1.8 KiB
Infinite Git
A Git HTTP server that generates a new commit every time someone pulls from the repository.
Features
- Implements Git smart HTTP protocol for read-only access
- Generates a unique commit on every pull/clone operation
- Thread-safe commit generation
- Persistent Git repository on disk
- Structured logging with slog
Installation
go install github.com/imjasonh/infinite-git/cmd/infinite-git@latest
Or build from source:
git clone https://github.com/imjasonh/infinite-git
cd infinite-git
go build -o infinite-git ./cmd/infinite-git
Usage
Start the server:
infinite-git
Options:
-addr: HTTP server address (default: ":8080")-repo: Path to Git repository (default: "./infinite-repo")-log-level: Log level - debug, info, warn, error (default: "info")
Example:
infinite-git -addr :3000 -repo /tmp/my-infinite-repo -log-level debug
Testing
Clone the repository:
git clone http://localhost:8080
Every time you pull, you'll get a new commit:
cd <cloned-repo>
git pull origin main
# New commit appears!
How It Works
- When a client initiates a pull/clone, the server intercepts the reference discovery request
- Before advertising refs, it generates a new commit with:
- A unique file containing the pull counter and timestamp
- A commit message indicating when the pull occurred
- The new commit is added to the main branch
- The updated refs are sent to the client
- The client receives the new commit as part of the normal Git protocol flow
Implementation Details
- Uses Git plumbing commands (
git add,git commit) to create commits - Implements pkt-line format for Git protocol communication
- Delegates object transfer to
git upload-packfor efficiency - Rejects all push attempts with 403 Forbidden
License
MIT