콘텐츠로 이동

작동 방식

Devsync의 동작 원리와 내부 구조

Devsync의 핵심 철학은 하나예요: 진실의 원천은 항상 로컬 파일이에요. 저장소는 동기화 사본일 뿐, 정본(canonical version)이 아니에요.

이 문서에서는 개념 모델, 데이터 흐름, 내부 구조를 설명해요.


대부분의 dotfile 도구는 저장소를 정본으로 취급해요. 도구를 통해 파일을 편집하면, 도구가 저장소와 로컬 파일 시스템 모두에 반영해요.

Devsync는 반대예요. ~/.zshrc를 그냥 편집기로 열어서 수정하면 돼요 — 특별한 명령이 필요 없어요. 동기화할 준비가 되면 devsync push를 실행하면 현재 로컬 파일을 읽어 저장소에 미러링해요.

편집기 → 로컬 파일 → devsync push → sync 저장소 → git push → 원격
다른 기기 ← devsync pull ← sync 저장소 ← git pull ← 원격

이 방식의 장점은 파일 편집 방식을 전혀 바꾸지 않아도 된다는 거예요. 트레이드오프는 저장소 상태가 마지막 push를 기준으로 한다는 점이에요 — 현재 로컬 파일의 최신 상태가 아닐 수 있어요.


devsync push를 실행하면 다음 순서로 동작해요.

  1. manifest.json을 읽어 활성 프로파일을 결정해요
  2. 각 추적 경로의 로컬 파일 트리를 탐색해요
  3. 로컬 파일과 sync 디렉터리의 기존 파일을 비교해요
  4. secret 모드 파일을 age로 암호화해요
  5. 미러링된 파일을 sync 디렉터리에 저장해요
  6. 변경 사항을 출력해요

devsync pull을 실행하면 다음 순서로 동작해요.

  1. manifest.json을 읽어 활성 프로파일을 결정해요
  2. sync 디렉터리의 파일을 읽어요
  3. secret 파일을 age 개인키로 복호화해요
  4. 필요한 상위 디렉터리를 생성하고 파일을 로컬 경로에 저장해요
  5. 파일 권한을 적용해요
  6. 변경 사항을 출력해요

Devsync의 모든 상태는 ~/.config/devsync/ 아래에 저장돼요.

  • 디렉터리~/.config/devsync/
    • 디렉터리sync/ Git 저장소 (동기화된 파일이 저장되는 곳)
      • 디렉터리.git/
      • manifest.json 설정 및 추적 레지스트리
      • 디렉터리default/ 기본(전역) 프로파일 파일
        • .gitconfig ~/.gitconfig 미러
        • 디렉터리.config/
          • 디렉터리nvim/ ~/.config/nvim 미러
      • 디렉터리work/ “work” 프로파일 파일
    • 디렉터리age/
      • keys.txt age 개인키 (시크릿 파일 복호화에 사용)
    • settings.json 전역 설정 (활성 프로파일 등)

매니페스트는 중앙 레지스트리예요. 추적 경로마다 소스 경로, 동기화 모드, 프로파일 지정 정보가 담긴 항목이 들어있어요.

{
"entries": [
{
"localPath": ".gitconfig",
"mode": "normal",
"profiles": []
},
{
"localPath": ".ssh/config",
"mode": "secret",
"profiles": []
},
{
"localPath": {
"default": ".config/nvim",
"win": "AppData/Local/nvim"
},
"mode": "normal",
"profiles": ["linux", "mac"]
}
]
}

localPath의 경로는 홈 디렉터리(~)를 기준으로 한 상대 경로예요.


Devsyncchezmoistow
진실의 원천로컬 파일저장소저장소
파일 편집 방식파일 직접 열기chezmoi edit저장소에서 편집
홈 디렉터리변경 없음변경 없음심볼릭 링크
템플릿 지원없음있음없음
기기별 내용 분기프로파일 / 플랫폼 경로템플릿오버레이

Devsync는 기존 편집 흐름을 최대한 유지하는 것을 우선으로 해요. 이미 편한 설정이 있고, 그것을 여러 기기에 그대로 복제하고 싶다면 Devsync가 잘 맞아요.