1
0
Fork 0
mirror of https://github.com/imjasonh/infinite-git synced 2026-07-08 09:05:06 +00:00
No description
Find a file
Claude 29666530cc
Fix four bugs: packfile offset tracking, HTTP error ordering, ref ordering, and race condition
- packfile.go: ReadObject now uses a countingReader to track compressed
  bytes consumed and properly advances r.offset, fixing sequential
  multi-object reads.
- handlers.go: Use commitSHA from GenerateCommit directly instead of
  re-reading refs, which fixes both the HTTP error-after-body-written
  issue and ensures HEAD is always advertised first (Git protocol
  requirement).
- commit.go: GenerateCommit now holds the repo lock for the entire
  read-modify-write cycle, preventing concurrent generates from reading
  the same parent and losing ref updates.
- repo.go: Added Lock/Unlock/GetRefsLocked methods to support holding
  the mutex across multiple repo operations.

https://claude.ai/code/session_015F9BYQoCy2P2zYZBuVeXHH
2026-04-02 05:52:24 +00:00
iac Deploy to Cloud Run with Terraform 2025-07-23 22:47:52 -04:00
internal Fix four bugs: packfile offset tracking, HTTP error ordering, ref ordering, and race condition 2026-04-02 05:52:24 +00:00
.gitignore Deploy to Cloud Run with Terraform 2025-07-23 22:47:52 -04:00
go.mod Implement pure Go Git HTTP server without CLI dependencies 2025-07-23 22:28:50 -04:00
go.sum Implement pure Go Git HTTP server without CLI dependencies 2025-07-23 22:28:50 -04:00
LICENSE Initial commit 2025-07-23 21:17:28 -04:00
main.go Implement pure Go Git HTTP server without CLI dependencies 2025-07-23 22:28:50 -04:00
main_test.go Update to use single hello.txt file instead of creating new files 2025-07-23 22:56:40 -04:00
plan.md Implement infinite Git HTTP server 2025-07-23 21:19:02 -04:00
README.md Update README.md 2025-07-23 23:11:15 -04:00
test.sh Implement pure Go Git HTTP server without CLI dependencies 2025-07-23 22:28:50 -04:00

Infinite Git

A Git HTTP server that generates a new commit every time someone pulls from the repository.

Try it out

Clone the repo

git clone https://infinite-git-nd2dq3gc7a-uk.a.run.app/ /tmp/infinite-git && cd /tmp/infinite-git

Pull, and just keep pulling:

$ git pull
warning: no common commits
Unpacking objects: 100% (40/40), 4.14 KiB | 847.00 KiB/s, done.
From https://infinite-git-nd2dq3gc7a-uk.a.run.app
   df979d4..d483466  main       -> origin/main
Updating df979d4..d483466
Fast-forward
 hello.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
$ git pull
warning: no common commits
Unpacking objects: 100% (43/43), 4.45 KiB | 912.00 KiB/s, done.
From https://infinite-git-nd2dq3gc7a-uk.a.run.app
   d483466..47f0fcb  main       -> origin/main
Updating d483466..47f0fcb
Fast-forward
 hello.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

.....and so on.

How It Works

  1. When a client initiates a pull/clone, the server intercepts the reference discovery request
  2. 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
  3. The new commit is added to the main branch
  4. The updated refs are sent to the client
  5. The client receives the new commit as part of the normal Git protocol flow

Why?

I think it's neat!