여러 기기 동기화 유지하기

기기 사이의 명령 순서, git으로 분기를 해결하는 방법, 기기마다 프로필을 주는 방법을 설명해요.

편집하기 전에 pull하기

dotweave는 git pull을 직접 실행하지 않아요. 그래서 한동안 쓰지 않은 기기에는 오래된 sync 디렉터리가 그대로 남아 있어요. 저장소를 받아 오는 일과 홈 디렉터리에 적용하는 일은 별개의 명령이고, 이 순서대로 실행해요.

sync 디렉터리를 열어 받아 오고, 자식 셸을 빠져나온 뒤 적용하세요.

dotweave cd
git pull
exit
dotweave pull

dotweave cd는 sync 디렉터리를 루트로 하는 자식 셸을 띄우고, exit으로 원래 셸로 돌아와요. git pull이 작업 트리를 갱신한 뒤에야 dotweave pull이 쓸 새 artifact가 준비돼요.

dotweave pull은 저장소에 없는 로컬 파일을 삭제하고, 계획을 적용하기 전에 물어봐요. 먼저 dotweave statusdotweave pull --dry-run으로 계획을 확인하세요.

pull하기 전에 편집하면 분기가 생겨요. 오래된 히스토리 위에 커밋하게 되고, 같은 파일에 대해 두 기기의 상태가 어긋나요.

분기는 dotweave가 아니라 git으로 해결하기

dotweave는 병합을 하지 않아요. 3-way 병합도, dotweave가 남기는 충돌 표시도, 해결용 UI도 없어요. 두 기기가 각각 push하고 커밋한 상태라면 그건 sync 저장소의 git 분기이고, dotweave cd 안에서 git으로 해결해요.

artifact는 평범한 파일이고, dotweave init* -text가 담긴 .gitattributes를 만들어서 git이 줄바꿈을 다시 쓰지 않게 해요. 그래서 normal artifact는 sync 저장소의 git diff로 읽을 수 있고, 다른 텍스트 파일처럼 한 줄씩 병합할 수 있어요.

secret artifact는 age 암호문이에요. 이 파일의 diff는 사람이 읽을 수 없고 한 줄씩 병합할 수도 없어요. 시크릿은 한쪽을 골라서 정리하고, 원하는 버전을 가진 기기에서 평문을 다시 push하세요.

기기마다 프로필 주기

기기마다 달라지는 설정은 공용 항목이 아니라 프로필에 두세요. 이름을 등록하고, 기기별 항목을 그 프로필로 제한하고, 해당 기기에서 프로필을 선택하세요.

dotweave profile add work
dotweave track ~/.config/work-vpn --profile work
dotweave profile use work

선택 값은 dotweave 홈 디렉터리의 settings.jsonc에 저장돼요. 이 디렉터리는 sync 디렉터리 밖에 있어서 커밋되지 않고, 기기마다 독립적으로 고를 수 있어요.

프로필에 배정된 항목은 다른 프로필이 활성인 동안 보이지 않아요. dotweave status에도 나오지 않고, pushpull 모두 그 항목을 다루지 않아요. 항목이 사라졌다고 판단하기 전에 활성 프로필을 확인하세요.

push는 다른 프로필의 artifact를 지우지 않아요. 그래서 저장소 하나가 모든 기기의 설정을 나란히 담아요.

시크릿에는 기기마다 조건이 하나 붙어요. 그 기기의 공개 키가 manifest.jsoncage.recipients에 있어야 하고, 짝이 되는 비밀 키가 그 기기의 keys.txt에 있어야 해요. 둘 중 하나라도 없으면 다른 기기가 쓴 내용을 복호화할 수 없어요. 키를 다루는 방법은 시크릿과 암호화에서 확인하세요.

구현과 참고

프로필 가시성 규칙과 기기별 선택 방식은 프로필에서 설명해요.

적용 전에 계획을 살펴보는 플래그는 dotweave pull에서, sync 저장소에 git을 실행하는 셸은 dotweave cd에서 확인하세요.