본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

한 방향 거울

~12 min · mirror, ledger, append-only, isolation

Level 0흔적
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

왜 vault 안에 Git을 넣지 않나

가장 짧은 구현은 vault root에서 git init을 하는 거야. 하지만 그러면 editor와 sync와 fleet copier가 .git 내부 수만 파일을 같이 만나. lock file, temporary object, permission bit처럼 기억과 무관한 Git mechanics가 live collaboration 표면으로 새어나와.

독립 mirror는 이 기계적 위험을 끊어. live tree에서 관리 대상 파일만 복사하고, Git은 mirror를 work tree로 삼고, bare repository는 history를 받아. vault는 Git이 존재한다는 사실조차 몰라도 돼. 서로의 failure mode를 같은 디렉터리에 집어넣지 않는 거지.

append-only는 자동으로 생기지 않아

Git을 쓴다고 원장이 append-only가 되는 건 아니야. reset, force push, checkout-to-source 같은 경로가 열려 있으면 과거를 다시 쓸 수 있어. append-only는 저장 형식보다 허용된 명령과 방향의 계약이야.

그래서 history writer는 현재 mirror snapshot을 commit으로 추가할 수만 있고, live vault를 checkout target으로 받지 않아. semantic edit도 먼저 vault에 쓰고 mirror sweep이 새 commit으로 따라와. 두 종류의 commit source가 있어도 둘 다 앞으로만 간다.

mirror는 byte evidence여야 해

mirror가 예쁘게 normalize하거나 frontmatter를 고치면 더 이상 원본의 증거가 아니야. 검색을 위한 정규화는 index에서 파생할 수 있지만 version mirror는 byte identity를 우선해야 해. 그래야 diff가 사람이 한 변화와 도구가 꾸민 변화를 섞지 않아.

예외와 제외 규칙도 명시돼야 해. editor cache나 sync internals처럼 memory가 아닌 것은 제외하지만, 확장자를 몰라서 조용히 빼면 안 돼. discovery된 관리 범위 전체가 기본이고 제외는 좁은 negative list여야 해.

재생성 리허설을 해

derived라고 적는 것만으론 부족해. 실제로 mirror와 index를 빈 디렉터리에서 다시 만들고 history head가 현재 source bytes를 가리키는지 확인해야 해. rebuild가 문서에만 있고 실행되지 않으면 다음 장애에서 cache가 사실상 원본으로 승격돼. 재생성 시간과 실패 로그도 운영 비용의 일부야.

one-way mirror는 source를 보호하면서 history를 얻는 구조야. Git을 쓴다는 사실이 아니라 역방향 동작이 존재하지 않는다는 사실이 안전을 만든다.

Code

격리된 mirror와 bare ledger의 최소 모양·bash
demo_dir=$(mktemp -d)
mkdir -p "$demo_dir/live" "$demo_dir/mirror"
printf 'memory\n' > "$demo_dir/live/note.md"
cp "$demo_dir/live/note.md" "$demo_dir/mirror/note.md"
git -C "$demo_dir/mirror" init -q
git -C "$demo_dir/mirror" add note.md
git -C "$demo_dir/mirror" -c user.name=demo -c user.email=demo@example.invalid commit -qm 'plant: note'
test "$(git -C "$demo_dir/mirror" show HEAD:note.md)" = memory

External links

Exercise

versioning하려는 live directory에서 도구 내부 파일이 source tree에 생기는지 확인해. 생긴다면 외부 mirror와 별도 history store로 분리한 diagram을 그려.
Hint
사용자가 편집하는 tree에는 그 사용자가 만들지 않은 lock, object, hook이 없어야 한다고 가정해봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.