OwnGit 내려받기

코드는 내 컴퓨터에 두고
잘못된 푸시는 되돌립니다.

OwnGit은 내 컴퓨터나 NAS, 홈 서버에서 돌리는 Git 서버입니다. 강제 푸시나 삭제로 브랜치가 바뀌어도 이전 커밋을 보관하므로, 내가 한 실수든 코딩 에이전트가 한 실수든 브라우저에서 되돌릴 수 있습니다. SQLite 파일을 쓰는 프로그램 하나로 돌아가고 메모리는 45~70 MB 정도 씁니다. 가입해야 하는 계정도 없습니다.

brew install juliankang4/tap/owngit

어떤 방법이든 호스트에 git-http-backend가 포함된 Git이 있어야 합니다. Homebrew와 Arch 패키지는 Git을 함께 설치합니다.

~/website
$ git push --force origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To http://127.0.0.1:18432/git/website.git
 + f744962...dfdad84 main -> main (forced update)
$ 
OwnGit에 강제 푸시한 실제 출력입니다. 덮어쓴 커밋 f744962은 보관된 기록에 남습니다.

Git 서버를 직접 두는 이유

Git 서버를 직접 운영하는 사람들이 자주 꺼내는 문제와 OwnGit이 각각을 다루는 방법입니다.

  • 비공개 코드를 남의 클라우드에 두고 싶지 않습니다.

    코드는 내 컴퓨터에 있습니다. 저장소는 내 컴퓨터나 NAS, 홈 서버에 평범한 bare Git 저장소로 저장됩니다. 클라우드 계정이나 구독은 필요 없고, 기존 저장소는 HTTPS로 접속하는 Git 호스트라면 어디서든 가져올 수 있습니다. OwnGit 소스는 MIT 라이선스로 공개되어 있습니다.

  • 강제 푸시나 브랜치 삭제를 되돌려야 합니다. 코딩 에이전트가 한 일도 마찬가지입니다.

    보관된 기록이 있습니다. 푸시로 덮어쓰거나 지운 브랜치와 태그를 OwnGit이 보관합니다. 브라우저에서 바뀔 내용을 모두 확인한 뒤 트리 전체나 고른 파일만 되돌립니다.

  • 필요한 날 제대로 복원되는 백업이 있어야 합니다.

    오프라인 백업이 있습니다. owngit backup은 ref와 객체, 풀 리퀘스트와 체크, 가져오기 기록, 옮길 수 있는 설정을 SHA-256 해시와 함께 복사합니다. owngit restore는 백업을 새 설치로 되살립니다.

  • 데이터베이스가 딸린 무거운 서버를 또 관리하고 싶지 않습니다.

    프로그램 하나에 45~70 MB 정도입니다. OwnGit은 Go 실행 파일 하나와 SQLite 파일로 돌아갑니다. 따로 띄울 데이터베이스 서비스가 없고, 실행할 때 Node나 Python도 필요 없습니다. 대기 중 메모리는 45 MB 정도이고 저장소가 1,000개면 70 MB 정도입니다.

  • 스팸 가입을 치우는 데 지쳤습니다.

    가입도 계정도 없습니다. OwnGit에는 가입 화면도 사용자 계정도 없어서 봇이 등록할 곳이 없습니다. 저장소는 누구나 쓰게 열어 두거나 공용 비밀번호 하나로 막고, 보안 설정은 별도의 관리자 비밀번호로 보호합니다.

  • 포트를 열지 않고 노트북에서 접속하고 싶습니다.

    tailnet에서 HTTPS로 엽니다. OwnGit은 기본적으로 자기 컴퓨터에서 오는 연결만 받습니다. 설정 화면이나 owngit tailscale on으로 Tailscale Serve를 켜거나, 쓰던 리버스 프록시를 앞에 두면 됩니다.

  • 코딩 에이전트가 정확하게 호출할 수 있는 도구가 필요합니다.

    owngit mcp와 JSON을 출력하는 명령이 있습니다. MCP 도구는 저장소, 풀 리퀘스트, diff, 체크를 다룹니다. 도구마다 무엇을 바꾸는지 밝히고 같은 이름의 명령과 똑같은 JSON을 돌려주므로, 셸을 쓰는 에이전트는 owngit pr diff를 바로 실행하면 됩니다.

강제 푸시로 덮어쓴 커밋 되돌리기

푸시가 브랜치를 덮어쓰거나 누가 브랜치를 지우면 OwnGit은 이전 커밋을 보관된 기록에 남깁니다. 브라우저에서 저장소를 열고, 되돌리면 바뀔 내용을 모두 확인한 다음 트리 전체나 고른 파일만 되돌리면 됩니다. 코딩 에이전트가 한 푸시도 같은 방법으로 되돌립니다.

보관된 기록은 백업이 아닙니다. 실수로 푸시한 비밀값도 함께 남으므로, 유출된 비밀값은 강제 푸시로 지우려 하지 말고 새로 바꾸세요.

대시보드
대시보드 화면 녹화입니다. 강제 푸시한 저장소에서 보관된 커밋을 고르고, 바뀔 내용을 모두 확인한 뒤 되돌립니다. 되돌리기는 대시보드에서 하며 이 작업을 하는 명령은 없습니다. 예제 저장소를 두고 OwnGit v1.1.0(9fef945)에서 녹화했습니다.

디스크가 고장 나는 날을 위한 백업

OwnGit을 멈추고 명령 하나를 실행하세요. 백업에는 보관된 기록을 포함한 모든 ref와 객체, 풀 리퀘스트와 체크, 가져오기 기록, 옮길 수 있는 설정이 들어가고, 손상을 알아낼 SHA-256 해시도 함께 저장됩니다. owngit restore는 백업을 새 상태 디렉터리에 되살립니다.

터미널
~
$ owngit backup --output ~/Backups/owngit-backup
Offline backup written to ~/Backups/owngit-backup. SHA-256 hashes detect
 corruption but do not authenticate a replaced backup.
$ owngit restore --input ~/Backups/owngit-backup --state-dir ~/restored-
state --repository-root ~/restored-repositories
Offline backup restored to ~/restored-state with repositories at ~/resto
red-repositories. Previous sessions, trusted hosts, and network settings
 were not restored.
OwnGit을 멈춘 상태에서 실행한 owngit backup과 owngit restore의 실제 출력입니다. 백업과 복원은 터미널에서만 합니다. 예제 저장소를 두고 OwnGit v1.1.0(9fef945)에서 녹화했습니다.

프로그램 하나,
메모리 45 MB 정도

OwnGit은 30 MB 정도의 Go 실행 파일 하나와 SQLite 파일로 돌아가며, 따로 띄울 데이터베이스 서비스가 없습니다. 이 수치는 Linux x64, Raspberry Pi 5, Windows 11, macOS에서 측정했습니다.

45MB

대기 중 메모리, 저장소 없음

Linux x64, Raspberry Pi 5, Windows 11

70MB

대기 중 메모리, 저장소 1,000개

저장소 100개일 때 50 MB 정도. macOS는 footprint 기준 67 MB

0.07초

시작부터 첫 화면까지

Linux x64에서 새로 시작할 때의 중앙값. Raspberry Pi 5는 0.2초

<1%

대기 중 CPU(코어 하나 기준), 저장소 1,000개

측정값 0.15~0.64%. 저장소가 100개 이하면 대체로 0.1% 이하

OwnGit 1.1.0을 설정한 뒤 아무도 쓰지 않는 상태에서 메모리가 안정되었을 때 상주 메모리(RSS 또는 working set)를 쟀습니다. 클론이나 푸시를 하면 Git이 따로 실행되며, 그 메모리는 저장소에 따라 다릅니다.

다른 셀프 호스팅 Git 서버 두 가지와 비교
서버대기 중, 저장소 없음대기 중, 저장소 100개
A171.0 MB178.0 MB
B190.9 MB196.4 MB
OwnGit 1.1.045.4 MB50.7 MB

세 서버 모두 같은 Debian 13 컨테이너(코어 2개, 메모리 2 GB)에 SQLite로 기본 설치하고, 6분 동안 안정시킨 뒤 서버 프로세스의 RSS를 쟀습니다. A와 B는 이슈 트래커, 위키, 패키지, CI처럼 기본으로 하는 일이 훨씬 많으므로 같은 일을 하는 조건이 아니라 기본 설치끼리 비교한 값입니다.

저장소 수에 따른 대기 중 메모리 Linux x64, 모든 막대는 같은 눈금
  • 저장소 없음44.8 MB
  • 저장소 100개49.8 MB
  • 저장소 1,000개69.4 MB

가입 화면도 열어 둘 포트도 없습니다

OwnGit에는 가입 화면도 사용자 계정도 없습니다. 저장소는 네트워크 안에서 누구나 쓰게 열어 두거나 공용 비밀번호 하나로 막고, 보안 설정은 별도의 관리자 비밀번호로 보호합니다.

노트북이나 휴대폰에서 쓰려면 설정 화면에서 공유를 켜거나 owngit tailscale on을 실행하세요. 그러면 OwnGit이 tailnet에 HTTPS로 열립니다. 켜기 전에 OwnGit은 컴퓨터와 tailnet 이름이 공개 인증서 로그에 남는다는 점을 알려 줍니다. 리버스 프록시도 쓸 수 있으며, 운영 안내에 Caddy, nginx, Traefik 예시가 있습니다.

예제 tailnet, 실제 Tailscale 아님
설정 화면의 네트워크와 Tailscale 카드, 그리고 같은 일을 하는 owngit network와 owngit tailscale입니다. 예제 tailnet으로 녹화했고 실제 Tailscale은 쓰지 않았습니다. 예제 저장소를 두고 OwnGit v1.1.0(9fef945)에서 녹화했습니다.

풀 리퀘스트는 브라우저나 터미널에서

풀 리퀘스트를 열고 바뀐 내용을 읽은 뒤, 확인한 커밋 그대로 병합합니다. 대시보드와 owngit pr는 같은 데이터로 같은 단계를 거칩니다. 리뷰는 선택입니다.

내 컴퓨터에서 실행한 체크는 검사한 커밋에 묶여 기록됩니다. 체크 결과는 참고용이며 병합을 막지 않습니다.

같은 풀 리퀘스트를 대시보드와 owngit pr로 다룹니다. 명령은 지정한 커밋만 병합합니다. 예제 저장소를 두고 OwnGit v1.1.0(9fef945)에서 녹화했습니다.

나와 코딩 에이전트를 위한 도구

owngit mcp는 표준 입출력으로 통신하는 로컬 MCP 서버이며 네트워크 포트를 열지 않습니다. 이 도구로 저장소, 풀 리퀘스트, diff, 체크를 읽고, 풀 리퀘스트를 만들고 리뷰하며, 클론에 커밋된 체크를 실행합니다. 결과는 같은 이름의 명령과 똑같은 JSON입니다. 클론 안에서는 owngit pr와 owngit repo가 origin에서 서버 주소를 찾습니다.

~/project녹화: Claude Code 2.1.283, 모델 sonnet
 ▐▛███▛█   Claude Code v2.1.283
▝▜██████▀  Sonnet 5 · Claude Max
 ▝▝   ▝▝   ~/project


❯ List the repositories on OwnGit. Open a pull request from feature/sitemap into main titled "Add   
  sitemap" and show its diff stat. Create a check task and run the checks. If they pass, approve    
  the pull request as reviewer "claude-code" and merge it. Reply in two short sentences.            

  Called owngit 3 times (ctrl+o to expand)

⏺ PR #1 diff stat: .owngit/checks.json (+12), sitemap.xml (+2) — 2 files, 14 insertions.

  Called owngit 2 times (ctrl+o to expand)

⏺ Checks passed (clean worktree, tested commit e0e3ec7). Proceeding to approve and merge.

  Called owngit 2 times (ctrl+o to expand)

⏺ OwnGit hosts one repository, "website"; PR #1 "Add sitemap" changed 2 files (+14 lines), passed
  its check (xmllint --noout sitemap.xml), was approved by "claude-code", and merged into main via
  fast-forward.

✻ Cogitated for 53s · done 2:46 PM

────────────────────────────────────────────────────────────────────────────────────────────────────
❯ delete the feature/sitemap branch
────────────────────────────────────────────────────────────────────────────────────────────────────
  ⏵⏵ auto mode on (shift+tab to cycle) · ← for agents

Claude Code, Codex, Pi를 코딩 도구 안내의 설정으로 연결하고, 같은 요청을 주어 각자 예제 저장소 사본에서 작업하게 했습니다. 도구 이름은 무엇으로 녹화했는지 밝히려고 적었습니다. 예제 저장소를 두고 OwnGit v1.1.0(9fef945)에서 녹화했습니다. Codex 데모는 OwnGit 1.0.3 (4de74df)에서 녹화했습니다.

명령 한 줄로 설치

어떤 방법이든 호스트에 git-http-backend가 포함된 Git이 있어야 합니다. Homebrew와 Arch 패키지는 Git을 함께 설치합니다.

brew install juliankang4/tap/owngit

macOS(Apple silicon)와 Linux(x64, ARM64)에서 쓸 수 있습니다.

시작하기

터미널에서 OwnGit을 처음 시작하면 그 자리에서 설정이 시작됩니다. 언어를 고른 뒤 터미널이나 브라우저에서 이어 가면 됩니다. 그다음부터 저장소는 대시보드나 owngit repo로 만듭니다.

owngit serve
$ owngit serve
2026/09/26 14:44:44 using git version 2.54.0 (Apple Git-157) at /Applica
tions/Xcode.app/Contents/Developer/usr/libexec/git-core/git (found on PA
TH; the Git behind the macOS /usr/bin/git shim, same version)
2026/09/26 14:44:44 OwnGit listening on 127.0.0.1:18432

    ___                   ___  _  _
   / _ \ __ __ __  _ _   / __|(_)| |_
  | (_) |\ V  V / | ' \ | (_ || ||  _|
   \___/  \_/\_/  |_||_| \___||_| \__|

  처음 설정   http://127.0.0.1:18432/

+- Language / 언어 ----------------------------------------------------
|  [1] English
|  [2] 한국어
|
|  Press Enter for the default. You can switch later with L.
|  Enter만 누르면 기본값을 씁니다. 나중에 L 키로 바꿀 수 있습니다.
+----------------------------------------------------------------------
  Choice / 선택 [2]: 2

+- OwnGit 설치 --------------------------------------------------------
|  OwnGit은 실행 중이지만 아직 설정되지 않았습니다. 설치 질문에
|  어디서 답할지 고르세요.
|
|  [1] 이 터미널에서 계속
|      여기서 몇 가지 질문에 답합니다. 비밀번호는 입력해도 화면에
|      나타나지 않습니다.
|
|  [2] 웹 대시보드 열기
|      이 터미널에서 브라우저를 승인한 뒤 브라우저에서 설치를 이어
|      갑니다.
|
|  [L] English
+----------------------------------------------------------------------
  선택 [1]: 1

+- 저장소 폴더 ------------------------------------------------- 1/5 --
|  OwnGit은 이 폴더 안에 저장소를 만들고, 폴더에 있던 파일은 그대로
|  둡니다.
|
|  전체 경로를 입력하세요. Enter만 누르면 제안한 폴더를 씁니다.
+----------------------------------------------------------------------
  제안: ~/OwnGit-
        Repositories
  폴더:
  [ok] 이 폴더를 쓸 수 있습니다.

+- 저장소를 읽고 쓸 수 있는 사람 ------------------------------- 2/5 --
|  네트워크 안에서의 평소 저장소 사용에 적용됩니다. 보안 설정은
|  언제나 관리자 비밀번호가 필요합니다.
|
|  [1] 이 네트워크의 모든 사람
|      읽기와 푸시에 비밀번호가 없습니다. 직접 관리하는 사설 LAN이나
|      Tailscale 네트워크에 적합합니다.
|
|  [2] 공용 비밀번호를 아는 사람
|      모두가 같은 비밀번호 하나를 사용합니다. 개인 계정은 없습니다.
|
|  [L] English
+----------------------------------------------------------------------
  선택 [1]: 1

+- 관리자 비밀번호 --------------------------------------------- 3/5 --
|  어느 브라우저에서든 보안 설정을 바꿀 때 필요합니다. 공용
|  비밀번호와는 다르게 정하세요.
|
|  8자 이상 1024자 이하로 입력하세요. 입력한 글자는 화면에 나타나지
|  않습니다.
+----------------------------------------------------------------------
  관리자 비밀번호:
  한 번 더 입력:
  [ok] 관리자 비밀번호를 입력했습니다.

+- 다른 기기에서 접속 ------------------------------------------ 4/5 --
|  [ok] 이 컴퓨터에서 Tailscale이 실행 중입니다.
|
|  Tailscale 주소   100.64.0.10
|  MagicDNS 이름    sample-host.example-tailnet.ts.net
|
|  다른 Tailscale 기기에서 OwnGit을 쓰려면 아래 명령으로 네트워크
|  설정을 저장하고, 설치를 마친 뒤 OwnGit을 다시 시작하세요. 나중에
|  설정 화면의 "네트워크"에서 바꿀 수도 있습니다.
|
|  Tailscale이 기기 사이의 연결을 암호화하지만, OwnGit은 그 보호를
|  확인할 수 없어 계속 일반 HTTP로 표시합니다.
+----------------------------------------------------------------------

  설정을 저장하는 명령 (한 줄 전체를 복사하세요):

owngit network set --listen 100.64.0.10:18432 --base-url http://sample-h
ost.example-tailnet.ts.net:18432

  OwnGit을 백그라운드 서비스로 실행해도 저장된 설정이 적용됩니다.
  서비스 정의에 --listen이나 --base-url 옵션이 있으면 저장된 값 대신
  옵션 값을 쓰므로 빼 두세요. OwnGit 문서의 "백그라운드 서비스의
  옵션"을 보세요.

  계속하려면 Enter를 누르세요:

+- 설정 확인 --------------------------------------------------- 5/5 --
|  설치 완료를 고르기 전에는 아무것도 저장하지 않습니다.
|
|  저장소 폴더       ~/OwnGit-Repositories
|  접근              이 네트워크의 모든 사람
|  관리자 비밀번호   입력함
|  연결              이 컴퓨터에서만
|
|  [1] 설치 완료
|  [2] 처음부터 다시
|
|  [L] English
+----------------------------------------------------------------------
  선택 [1]: 1

+- [ok] 설치를 마쳤습니다 ---------------------------------------------
|  대시보드   http://127.0.0.1:18432/
|
|  준비되면 첫 저장소를 만드세요.
+----------------------------------------------------------------------
  OwnGit은 계속 실행됩니다. 아래로 서버 로그가 이어집니다.

2026/09/26 14:44:47 setup completed
2026/09/26 14:44:47 OwnGit ready at http://127.0.0.1:18432/
터미널에서 처음 실행한 뒤 터미널이나 대시보드에서 저장소를 만듭니다. 임시 홈 폴더와 시험용 포트 18432에서 녹화했습니다. 예제 저장소를 두고 OwnGit v1.1.0(9fef945)에서 녹화했습니다.