동기화가 작동하는 방식
push와 pull 파이프라인, dotweave가 git을 대신 실행하지 않는 이유, dry run이 알려 주는 내용을 설명해요.
스냅숏 둘과 계획 하나
데이터를 옮기는 dotweave 명령은 모두 스냅숏 두 개를 만들어 비교해요. 로컬 스냅숏은 홈 디렉터리 아래의 추적 경로를 훑어요. 저장소 스냅숏은 sync 디렉터리의 profiles/ 아래에 이미 저장된 artifact를 읽어요.
두 스냅숏의 차이가 곧 계획이에요. dotweave status는 양방향 계획을 출력하고 아무것도 쓰지 않아요. dotweave push는 로컬에서 저장소 방향으로 계획을 적용하고, dotweave pull은 반대 방향으로 적용해요.
push와 pull 모두 --dry-run을 받아요. 계획을 만들어 출력하기만 하고 적용하지는 않아요. 명령이 무엇을 건드릴지 확실하지 않을 때 쓰세요.
push가 쓰는 것
push는 추적 경로를 읽어서 profiles/<profile>/ 아래 artifact를 그에 맞게 다시 써요. 쓰기 전에 내용을 비교하기 때문에 변경되지 않은 파일에는 쓰기가 아예 일어나지 않아요.
normal 항목은 그대로 복사돼요. secret 항목은 manifest.jsonc의 모든 recipient를 대상으로 암호화되고 .dotweave.secret 접미사가 붙어 저장돼요. 심링크는 링크 대상을 담은 <name>.dotweave.symlink 파일로 저장돼요. ignore 항목은 건너뛰어요.
시크릿을 비교할 때는 저장된 암호문을 복호화해서 평문을 비교해요. 그래서 변경되지 않은 시크릿을 다시 push해도 새 암호문이 생기지 않고, git 히스토리에 의미 없는 변경이 쌓이지 않아요.
push는 더 이상 필요 없는 artifact도 제거해요. 다른 플랫폼의 오버라이드나 다른 프로필이 소유하는 artifact는 보호하기 때문에, Linux 기기에서 push해도 Windows 기기가 저장한 내용은 지워지지 않아요.
dotweave push
· Pushing changes...
✔ Push complete
plain: 2
encrypted: 1
symlinks: 0
dirs: 1
0 stale artifacts removed
pull이 쓰는 것
pull은 저장된 artifact를 읽어서 해석된 로컬 경로에 다시 써요. 시크릿은 keys.txt의 identity로 먼저 복호화해요.
모든 로컬 쓰기는 대상 옆의 임시 디렉터리에 준비한 뒤 제자리로 rename해요. 그래서 pull이 중단되더라도 설정 파일이 절반만 쓰인 상태로 남지 않아요. 오래된 로컬 경로는 가장 깊은 경로부터 위로 올라가며 제거하고, 디렉터리는 모든 하위 항목이 이미 제거 대상일 때만 제거해요.
pull은 적용하기 전에 물어봐요. 프롬프트를 건너뛰려면 --yes를 넘기세요. 비대화형 터미널에서는 추측하지 않고 명령이 실패해요.
pull은 저장소에 없는 로컬 파일을 삭제해요. 첫 push 전에는 모든 추적 경로가 Remove locally에 나타나요. 먼저 dotweave status를 실행하세요.
dotweave는 git을 대신 실행하지 않아요
push와 pull은 디스크의 파일만 바꿔요. 둘 다 git add, git commit, git push, git pull을 실행하지 않아요. dotweave가 git을 읽는 건 sync 디렉터리가 작업 트리인지 확인할 때와, 어떤 artifact가 오래되었는지 판단하려고 커밋된 프로필 이름을 조회할 때뿐이에요.
즉 게시는 별개의 명시적인 단계예요.
dotweave push
dotweave cd
git add -A && git commit -m "Update config"
git push
dotweave에는 데몬도, 파일시스템 감시자도, 백그라운드 프로세스도 없어요. 명령을 실행하지 않으면 아무것도 동기화되지 않아요.
git이 전송 계층이기 때문에 기기 사이의 분기는 git 충돌이고, git으로 해결해요. dotweave는 병합하지 않아요.
구현과 참고
sync 디렉터리 구조는 디렉터리와 저장소 구조, 항목별 mode 값은 동기화 모드에서 설명해요.
적용하지 않고 계획만 보려면 dotweave status를, 이 모델에서 나오는 반복 흐름은 매일 쓰는 push와 커밋 흐름을 확인하세요.