15P by GN⁺ 2일전 | ★ favorite | 댓글 1개
  • git-annex는 큰 파일의 콘텐츠를 Git 저장소에 직접 넣지 않고도 관리하게 해주는 도구
  • 오프라인·온라인 환경에서 동기화, 백업, 아카이브를 수행하며 체크섬과 암호화로 안전성을 보장
  • Git의 분산 특성을 대용량 파일에 적용하여 여러 드라이브·서버·클라우드 간 위치 추적과 전송을 단순화
  • CLI 중심 사용자에게 적합하며, 일반 사용자를 위한 git-annex assistant는 폴더 동기화식 사용성을 제공
  • 장기 보존을 위한 단순 리포지토리 포맷과 다양한 특수 리모트를 통해 아카이빙·이동 작업 흐름을 확장하는 도구임

개요

  • git-annex는 파일의 내용은 Git 밖에 두고, 메타데이터와 위치 정보만 Git으로 관리하는 방식의 대용량 파일 관리 도구
    • 결과적으로 커밋 히스토리는 가볍게 유지하면서 대용량 바이너리의 보관과 이동을 유연하게 처리
    • 체크섬과 암호화 지원으로 무결성과 기밀성을 보장
  • 오프라인·온라인 모두에서 동기화, 백업, 아카이브를 수행하며, 분산된 저장소 간에 동일 파일의 사본 개수 관리와 로그 기록 기능을 제공
  • 명령줄 사용자에게 최적화되어 있으나, git-annex assistant를 통해 일반 사용자도 폴더 동기화 형태로 쉽게 사용할 수 있음
  • 첫 사용자를 위한 walkthrough 문서를 제공하여 설치·기본 흐름 등을 빠르게 배울 수 있음

사용 사례: Archivist(아카이브 지향 사용자)

  • 여러 개의 오프라인 보관 드라이브를 운용하면서도 단일 디렉터리 트리에서 모든 파일을 하나처럼 탐색·재조직할 수 있음
    • 파일 내용이 오프라인 드라이브에 있어도, 인덱스와 포인터를 통해 실제 삭제 위험 없이 재배치와 커밋이 가능함
  • 특정 파일이 필요한 시점에 어떤 드라이브에 존재하는지를 알려주고 손쉽게 가용 상태로 전환할 수 있음
    • 각 드라이브는 상호 위치 정보를 공유하여 전체 보관 현황을 이해함
  • 단순한 리포지터리 포맷을 사용하여, git-annex 및 git을 사용하지 않더라도 장기적으로 파일 접근성이 유지
  • cron 작업으로 야간에 신규 파일을 자동 아카이브하고, 의도적·비의도적 사본을 기록하여 복제 필요 시점을 판단하는 근거를 제공

사용 사례: Nomad(이동 중심 사용자)

  • 노트북, 휴대용 USB 드라이브/키드라이브, 원격 서버, 클라우드 암호화 저장소 등 이질적 저장소를 Git 리모트처럼 일관되게 관리
    • 이동 중에는 서버에 다운로드 대기열을 쌓아두고, 연결 품질이 좋은 장소에서 실제 전송을 수행하는 지연 전송 흐름을 지원
  • 배터리 절약 등을 위해 USB에서 순간 복사 후 로컬 소비 같은 오프라인 친화적 워크플로우를 구성 가능
  • 사용 완료 후 유지·삭제 대상을 지정하면 로컬 공간을 회수하고, 다음 동기화 시 변경 사항을 서버와 동기화
  • 특수 리모트(special remotes)전송 파이프라인을 통해 다양한 스토리지 백엔드와 네트워크 상황에서 유연한 데이터 이동을 실현

핵심 기능과 이점

  • 콘텐츠 주소화와 체크섬을 기반으로 한 무결성 보장 및 암호화 저장 지원으로 안전한 장기 보존 구현
  • 위치 추적(location tracking) 을 통해 각 파일의 보관 위치, 사본 개수, 가용성을 명확히 파악
  • 분산 버전 관리 모델을 대용량 파일에 적용하여, 중앙 집중식 스토리지 의존도를 줄이고 오프라인 내성을 확보
  • assistant 모드로 폴더 동기화 경험을 제공하여, CLI 미숙자도 드래그 앤 드롭 수준의 사용성을 확보

장점 요약

  • git-annex는 파일 레퍼런스만 git으로 관리하므로, 대용량 파일을 부담 없이 다루는 데 적합
  • 분산 구조를 통해 여러 장치·위치에서 자유로운 파일 이동, 저장, 동기화·백업, 버전 관리가 가능함
  • 오프라인 및 장기 보존 시나리오, 혹은 여러 장치·클라우드를 넘나드는 유동적 데이터 관리에 특히 뛰어난 통합성확장성을 가짐
  • 아카이브 지향과 이동 지향의 혼합형 사용자에게도 적합하며, 사본 정책 관리백엔드 다변화로 조직·개인 모두에 유용함
  • Git의 분산성과 이식성을 대용량 데이터로 확장하여, 장기 보관·이동 작업의 운영 리스크와 수고를 낮추는 도구
Hacker News 의견
  • 나는 git-annex를 사용해 모든 드라이브의 데이터를 관리함. 각 파일이 어느 드라이브에 있는지 자동으로 추적하고, 복사본 개수를 충분히 유지하며, 모든 파일에 대해 체크섬을 확인함. 오프라인 드라이브도 문제없이 잘 동작함. git-annex는 초반에 이해하기 조금 어렵게 느껴질 수 있어서, 임시 저장소를 하나 만들어서 walkthrough를 따라해보고 실습해보는 걸 추천함. 그리고 다양한 workflow도 참고할 만함

    • 데이터를 얼마나 보관하고 있는지 궁금함. 나는 약 10만~100만 개 파일, 수 TB의 사진 데이터를 ZFS에서 git-annex로 관리 중임. 초반에는 아무 문제 없었으나, 최근엔 명령 하나하나에 5~30분씩 걸릴 정도로 점점 느려지고 있음. 이게 ZFS 때문인지, git-annex 때문인지, 아니면 디스크 때문인지 헷갈림

    • 예전부터 git-annex로 데이터 관리하는 걸 생각했으나, 파일을 완전히 삭제하는 데 마찰이 있기도 하고 몇 가지 문제를 만남. 혹시 시간이 된다면 어떻게 사용하는지 공유해줄 수 있는지 궁금함

  • 페이지에는 안 나와 있지만 git-annex는 Joey Hess가 만들었음. 그는 moreutils, etckeeper도 개발함

    • 개인적으로 더 유명한 사실은, 그가 1996년부터 수십 년 동안 Debian 핵심 컨트리뷰터로 활동했다는 점임. 오늘날 우리가 생각하는 리눅스의 큰 부분이 그의 손끝에서 나옴
  • 최근 Git의 새로운 네이티브 대용량 오브젝트 관리 기능에 대한 논의가 여기에서 있었음

    • 덧붙이자면, 왜 논의가 크게 관련 없다 보는지 댓글에도 밝혔음. annex는 "대용량 파일 in git" 문제와는 실제로는 좀 다른 영역임. git-annex는 마치 LFS 등에서 "서버 측" 저장 문제를 git 네이티브 방식으로 분산 처리한다는 관점에서 보면 이해가 쉬움
  • git-annex의 아쉬운 점은 Haskell임. 언어 자체를 싫어하는 건 아니지만, 설치해야 할 의존성 개수가 정말 많아서 놀라웠음. 그 중 상당수는 다른 데서 필요하지 않고, 여러 애플리케이션에서 버전 충돌도 잘 남. 시스템 패키지 매니저로 설치하면 특히 힘듦. annex랑 pandoc 두 개만 설치해도 하루 수십 건씩 Haskell 패키지 업데이트가 계속됨. 만약 소스에서 빌드하는 배포판을 쓰면 악몽임. 사실 대부분은 정적으로 링크해도 안전하다고 생각함. 그런데도 Haskell 진영에서는 이를 미세한 라이브러리 모듈화의 결과라고 함. 하지만 시스템 관리 등 다른 우선순위도 있는데, Rust, Go, Zig, C, C++에서는 이런 문제를 경험한 적이 없음. Haskell 생태계와 사용자에 적대적인 건 아니고, 나도 배울 생각임. 그런데 왜 이 문제가 존재하고, 해결책은 무엇인지 궁금함

    • Haskell 툴링에서는 정적 링크도 이미 지원함. 나는 Solus용 Haskell 스택을 관리하고 있는데, pandoc은 libc만 의존하고 모든 Haskell 패키지는 바이너리에 정적으로 묶어서 Rust랑 똑같이 배포함. 즉, 충분히 할 수 있는 일임. Solus에서는 의존성이 너무 많아서 그냥 정적 링크로 돌림. 배포판 유지자 판단의 문제라 봄

    • “대부분 정적으로 링크해도 안전하다”는 부분에 대해, 배포판 repo라면 결국 패키지 매니저 정책 이슈 아닌지 궁금함

    • 풀타임 Haskell 개발자 입장에서도 정적 링크되지 않은 Haskell 패키지에는 비슷한 거부감 있음. AUR에는 이미 정적으로 링크된 버전이 있으니 적어도 불가능하진 않음. 왜 패키저들이 굳이 동적 링크를 고집하는지 나도 파고든 적은 없음. 대체로 동적 링크가 내부 소프트웨어 유통에는 맞을 수 있는데, 아마 그걸 배포판에 불필요하게 투영하고 있는 듯함

    • 어떤 패키지 매니저를 쓰는지 궁금함. apt 기반 시스템에서는 Haskell로 인해 문제 겪은 적 없음

    • 매번 pacman -Syu하면 업데이트의 절반이 Haskell 패키지여서 짜증남. 아마도 원인은 pandoc이나 shellcheck 때문임

  • git-annex는 정말 쿨한 기술임. 하지만 내 인상으론 단일 사용자 저장소에서 제일 잘 동작함. 예를 들면, 한 사람이 자신의 파일, 문서, 음악 등 다양한 기기를 넘나들며 개인 데이터 관리할 때 적합함. 대용량 파일 다루는 협업 저장소에서 동기화 목적으로 써봤지만, "magic" 브랜치 방식이 잘 확장되지 않음

    • 사용자마다 다를 수 있으나, 우리 기관에서는 오히려 잘 동작함. 우리는 디지털 아카이브 기관이고, 내부 저장소의 백엔드로 git-annex를 10년 넘게 사용함. 직원은 15~20명 수준이지만, 30TB 이상 데이터와 75만 개 파일(이진+메타데이터), 수백 개의 저장소를 무리 없이 다룸
  • 나는 self-hosted forgejo를 사용 중임. 아직 git-annex가 LFS보다 뛰어난 부분을 못 찾겠고, 세팅도 쉽지 않을 것 같음. git-annex가 Haskell로 짜인 것도 마음에 안 들고, 대략 50% 느리다는 얘기도 찾음(단, 출처 하나라 신뢰할 수 있는 정보인지는 아직 모름). 명령어가 복잡한 이유는 있겠지만, LFS처럼 .gitattributes만 만져주면 거의 모든 걸 알 수 있는 편리함이 없음. git-annex에 .gitattribute와 비슷한 투명성도 못 느꼈음. 그리고 'git lfs ls-files'에 상응하는 명령어를 보여주는 튜토리얼도 없다면 별로 관심 안 생길 것 같음. 나는 'git status'와 'git lfs ls-files'로 확인하는 습관이 있음

    • 속도가 느린 게 Haskell 때문은 아님. git-annex는 분산 백업 도구여서 I/O와 데이터 보존에 심하게 집착하는 동작이 느림의 원인임. 예를 들어 drop 명령을 쓰면, 실시간으로 모든 remote에서 해당 내용이 존재하는지 확인해야 해서 느려짐. --fast 옵션 등으로 로컬 메타데이터만 신뢰하고 검증 과정을 생략하면 훨씬 빨라짐(하지만 약간 위험함)

    • LFS와 git-annex는 미묘하게 다른 용도임. LFS는 git 저장소에 대용량 파일이 섞인 개발 예시(예: 게임 개발)에 적합함. git-annex는 중요한 데이터를 백업하려고 쓸 때, 음악 폴더처럼 큰 파일 묶음을 여러 곳에 보관할 때 더 어울림. 나는 후자 형태로 사용함

    • git-annex를 지원하는 Forgejo soft-fork가 있음: forgejo-aneksajo

    • git-annex로 관리하는 최대 저장소는 여러 시스템에 분산되어 있는 수 TB짜리임, 파일 크기도 10GB 넘는 게 많음. 작성자가 원하는 게 git-lfs-ls-files라면, git-annex에도 git annex list --in here가 아마 유사한 역할임

  • 커맨드라인 문서에 실제 활용 사례가 맨 앞에 나오는 팬심을 보여줌. 많은 도구들은 보통 잘 쓰이지도 않는 알쏭달쏭한 옵션 설명부터 시작해서 아쉬웠음

  • GitHub는 LFS에 Microsoft 방식의 NIH(Not Invented Here)를 적용하며 git-annex를 도입하지 않았음

    • 나도 git-annex가 더 우아하다고 생각하지만, 크로스플랫폼 호환이 약함. 참고로 LFS는 GitHub와 Bitbucket(정확히는 어느 forge인지 기억은 안 남) 협업에서 나왔음. 한쪽은 구현을, 한쪽은 이름을 제공해서 Git 컨퍼런스에서 만난 뒤 합쳐짐. 요즘 가장 아쉬운 점은 GitHub의 대용량 프로젝트에 적용되는 한계치임. 추가로 "모든 오브젝트를 로컬에 가져와야 푸시할 수 있음" 정책 때문에, 규모 있는 개발 커뮤니티는 금방 한계치 초과함. 참고: git-lfs에 기여한 경험 있음

    • (솔직히) GitHub의 NIH 접근법이 모든 면에서 불리함. git-annex를 사랑한 발표자가 있음: Staying in Control of your Scientific Data with Git Annex by Yann Büchau

  • 아이러니하게도, 나는 지난 주말 하루 동안 자체 대용량 파일 버전 관리 시스템을 만들어봄. git-annex를 그 정도로 싫어함. 파일을 blob으로 바꿔버리고 파일 시스템을 부풀림. 내 주요 목적은 분산 파일 간 동기화인데 버전 관리 자체에는 관심 없음(대체 대용량 파일에 버전 관리를 왜 필요로 하는지 이해가 안 감). AI로 Python을 활용하면 파일을 해시해서 룩업 테이블을 만들고, rclone으로 소스를 동기화하는 헬퍼 메소드도 만들 수 있음. 훨씬 더 간단하고 효율적인 방법들이 많음

  • 여러 해 동안 써 봤는데, 제일 큰 장점은 클라우드 스토리지 프로바이더와 백업 연동이었음. 그런데 그 연동 기능이 늘 불안정하고, 유지되지 않는 서드파티 플러그인에 의존함. 한때 데이터 불일치 버그도 있었어서 결국 포기함. 최근 5년 사이 개선이 있었는지 궁금함

    • 클라우드 스토리지 프로바이더 종류에 따라 다르다고 생각함. S3, webdav, sftp 등 공식 표준 프로토콜을 지원하는 곳이 유리함. 최근 들어선 rclone 기반의 special remote가 git-annex에 내장되어서, 이게 예전 제삼자 remotes보다 더 잘 관리되고 rclone이 지원하는 거의 모든 cloud remote와 연동 가능함