오브젝트 스토리지 위에서 Git을 돌리려고 packfile 포맷을 새로 만든 Tigris의 objgit
- Tigris Data가 오브젝트 스토리지 기반 Git 서버 objgit을 오픈소스로 공개했고, dotgit을 파일시스템 shim으로 매핑하던 첫 방식이 실제 크기 저장소에서 너무 느려서 컬럼 기반 자체 packfile 포맷을 새로 만듦
- Git 오브젝트는 내용의 SHA-1을 파일명으로 쓰는 콘텐츠 주소 지정 zlib 압축 파일이며, 리눅스 커널 저장소는 개별 오브젝트 대신 pack 디렉터리의 .idx/.pack/.rev 세 파일에 전부 들어 있음
- objgit 체크아웃 기준 loose 오브젝트 756개, 3500KB가 git gc 후 in-pack 1203개, size-pack 848KB로 합쳐지는 식으로 packfile이 오브젝트 수와 크기를 줄임
- 새 포맷은 클라이언트 쪽 변경 없이 Git 오브젝트를 오브젝트 스토리지 오브젝트처럼 다루게 해 주며, 백엔드에서 오브젝트 이름 참조를 FoundationDB에 저장함
- 저자는 packfile의 델타 오브젝트를 별도 오브젝트로 저장하자고 제안했지만, HN 댓글에서는 델타 인코딩의 목적을 오해한 것이라는 반박이 나옴
Hacker News opinions
git-on-durable-objects 프로젝트도 봤는데, 난 그냥 정통 오브젝트 스토리지 옵션이 훨씬 좋더라.
이게 왜 아직까지 안 됐는지 진짜 신기함. gitlab이나 forgejo, gitea가 전부 오브젝트 스토리지 지원하면 좋겠는데 지금은 저장소마다 파일시스템이 있어야 하잖아.
이미 된 적 있음. 지금 안 쓰는 건 비효율적이라서임. 오브젝트 스토리지는 아니었지만 git을 dumb http 서버로 정적 파일 서빙할 수 있었고, 이제 오브젝트 스토리지도 정적 파일을 서빙한다는 걸 누가 알아낸 것뿐임.
리눅스에선 Fuse 쓰면 됨. git-snap-fs 같은 것도 있고.
awslabs/git-remote-s3도 있음. 이건 git remote add origin s3://my-git-bucket/my-repo 이렇게 바로 됨.
Git At Any Scale 이후로 이런 게 확 늘었음. walgit-elixir, walgit, micelio 다 비슷한 계열임.
다음 단계는 whole-file 해시를 Merkle Patricia tree 해시로 바꾸고 BitTorrent식 배포까지 얹는 거지. 중복 제거 이점은 덤이고. GitTorrent가 예전에 이미 했던 거라 역사는 반복됨.
델타 오브젝트를 원본 끝에 붙이지 말고 별도 오브젝트로 저장하라는 건, 델타 인코딩이 왜 존재하는지 모르는 소리임. 행운을 빌어주겠음.
3일 동안 네 번째 제출인데 이거 마케팅 스팸 아님? 폰트부터 별로인 사이트고.
그냥 내가 우연히 봤으면 자연스럽게 올렸을 만한 글임. 사흘에 여러 번 올라온 건 여러 사람이 보고 각자 올린 거라고 보는 게 맞음.
git update-server-info 쓰면 됨. 클라이언트가 pack에 range request를 날릴 수 있게 보조 파일을 만들어줌. rgitweb이 그 예로, pack을 어디에 저장하든 상관 안 하고 데이터만 있으면 됨.
enroute라는 것도 최근에 봤는데 이것도 오브젝트 스토리지 위에서 git을 돌림. 기존 forge를 프록시하다가 나중에 오브젝트 스토리지 백엔드로 넘어가는 git-proxy 아이디어가 재밌더라.
postgres 위에서도 git 돌릴 수 있음. pggit라고 있음.
GitSocial이 정확히 이걸 함. 저장소 정적 사이트까지 생성해줘서 버킷 하나로 전부 서빙 가능함.