콘텐츠로 이동

머신 상태

Dojang은 저장소별 중간 스냅샷과 로컬 메타데이터를 플랫폼의 사용자 데이터 디렉터리에 보관합니다. 이 상태는 저장소와 함께 이동하지 않습니다. dojang.tomlrepository-id는 저장소와 함께 이동하는 안정적인 UUID이며, 체크아웃을 옮기거나 이름을 바꿔도 올바른 로컬 상태를 찾는 데 쓰입니다.

등록된 저장소가 하나뿐이면 저장소 명령은 기록된 체크아웃을 자동으로 선택할 수 있습니다. 자동 선택은 체크아웃 안에 있는 사용자 지정 이름을 포함해 기록된 선언 파일 경로도 복원합니다. 기록된 외부 선언 파일은 여러 활성 체크아웃의 중복 소유권을 판정할 때 여전히 유효하지만, 이 레이아웃을 선택하려면 -r/--repository-dir-m/--manifest-file을 명시해야 합니다.

dojang init은 새 저장소의 식별자와 상태 레코드를 만듭니다. 서로 관계없는 저장소에 식별자를 복사하지 마세요. 한 머신에 같은 식별자를 가진 체크아웃이 둘 이상 있으면 오류로 처리됩니다. 심볼릭 링크 별칭을 포함해 같은 체크아웃으로 해석되는 경로는 중복으로 간주하지 않습니다. 기존 저장소에서 dojang init을 다시 실행하면 기존 선언 파일을 거부하지 않고 현재 머신의 선언한 정보를 등록합니다. 체크아웃을 옮겨도 머신 정보와 연결한 정보 파일 경로는 저장소 식별자를 따라갑니다. dojang forget은 이 연결을 제거합니다.

저장 위치

상태 루트는 플랫폼별 관례를 따릅니다.

  • Linux: $XDG_DATA_HOME/dojang. XDG_DATA_HOME이 없거나 비어 있거나 상대 경로이면 ~/.local/share/dojang
  • macOS: ~/Library/Application Support/dojang
  • Windows: %LOCALAPPDATA%\dojang. LOCALAPPDATA가 없거나 비어 있거나 상대 경로이면 ~/AppData/Local/dojang

Dojang은 이 레이아웃을 만들기 전에 상태 루트의 파일 시스템 별칭을 해석합니다. 따라서 플랫폼 사용자 데이터 디렉터리는 심볼릭 링크여도 되지만, Dojang의 비공개 상태 레이아웃 안에 있는 심볼릭 링크는 여전히 허용되지 않습니다.

루트 아래의 비공개 레이아웃은 다음과 같습니다.

machine.toml
machine.lock
manifest-identity.lock
repositories/
    <repository-id>/
        state.toml
        state.lock
        snapshots/
            current/
            targets/
                <경로-규칙-세대>/

machine.toml은 스냅샷을 소유한 머신을 식별합니다. 각 state.toml 레코드는 스키마 버전, 저장소와 머신 식별자, 불투명한 세대 UUID, 마지막 체크아웃 경로, 그 체크아웃에서 사용한 선언 파일 경로, 중간 스냅샷과 관리 대상 기준 사본의 루트, 연결한 정보 파일과 선언한 머신 정보, 시각 정보, 그리고 관리 대상·훅 실행 기록·수명 주기 레코드를 위한 타입이 정해진 영역을 포함합니다. 잊은 저장소 레코드를 다시 만들 때는 시각 정보가 이전 레코드와 같더라도 새 세대 UUID를 발급합니다. 스키마 버전 6은 관리 대상 레코드에 코덱 이름과 버전, 설정 다이제스트, 캐시 키, 의존성 지문을 추가할 수 있습니다. 원본 바이트나 렌더링된 바이트의 다른 사본은 저장하지 않습니다. 버전 5 문서는 그대로 읽으며 코덱 캐시 메타데이터가 없는 identity 코덱으로 간주합니다. 스키마 버전 5는 관리 대상 레코드에 경로 규칙이 선언한 종류와 이식 가능한 모드를 추가하고 배포 링크의 링크 대상 문자열을 지문으로 저장했습니다. 버전 4 문서도 그대로 읽을 수 있으며, 해당 필드가 없으면 선언된 모드가 없는 복사 경로 규칙으로 간주합니다. 스키마 버전 4는 머신 정보와 파일 연결을 저장하고, 버전 3은 성공한 onceon-change 훅 실행을 이벤트와 안정적인 훅 식별자별로 저장하도록 도입했습니다. 스키마 버전 1부터 3까지는 메모리에서 업그레이드하며 기존의 불투명한 훅 데이터는 보존합니다. 최초 적용 성공 여부도 전역 현재 저장소 파일이 아니라 저장소별로 기록됩니다.

이 파일들은 구현 세부 사항입니다. 레코드가 손상되었거나 더 새로운 스키마 버전을 사용하거나, 다른 저장소 또는 머신에 속하면 Dojang은 이를 상태 부재로 간주하지 않고 중단합니다. 상태 문서 자체는 올바른 UTF-8이어야 하며, 해독할 수 없는 바이트를 다른 문자로 치환하지 않고 손상으로 보고합니다. 상태 문서는 디렉터리나 심볼릭 링크가 아닌 일반 파일이어야 합니다. 저장소 데이터가 남아 있는데 machine.toml이 사라졌다면 새 머신 식별자를 발급하지 않고 손상으로 보고합니다. 마찬가지로 마이그레이션 마커나 스냅샷 데이터가 있지만 state.toml 레코드가 없는 저장소 디렉터리는 중단되었거나 손상된 항목으로 보고합니다. dojang forget 뒤에도 남는 hook-<sha256>.lock 파일에는 저장소 상태가 없으므로 무시합니다. 스냅샷에 관한 재시도 가능 예외는 첫 원자적 상태 쓰기가 끝나기 전에 남은 빈 비공개 snapshots/current/ 디렉터리뿐입니다. 저장소 탐색은 상태 잠금을 잡은 채 항목을 확인하며 다른 저장소를 조용히 선택하지 않습니다. 디렉터리 이름이 올바른 저장소 ID가 아닌 비어 있지 않은 항목도 손상으로 보고합니다. repositories/ 저장소 자체도 일반 디렉터리여야 하며, 그 경로의 파일이나 심볼릭 링크를 빈 저장소로 간주하지 않습니다. 머신 상태를 사용하는 명령은 체크아웃을 변경하기 전에 이 저장소를 검증합니다. -r/--repository-dir로 저장소를 명시적으로 선택해도 같습니다. 올바른 저장소 ID 이름을 가진 디렉터리도 심볼릭 링크가 아닌 실제 디렉터리여야 합니다. I/O 오류 때문에 상태 경로를 검사·생성·읽기·갱신할 수 없다면 예상하지 못한 오류 예외를 내보내지 않고 종료 코드 13의 머신 상태 오류를 보고합니다. 저장소 레코드는 원자적으로 교체하므로 쓰기 도중 중단되어도 이전의 완전한 레코드가 남습니다. 잠금 파일은 머신 식별자와 상태의 동시 갱신을 직렬화하며, 각 갱신은 고유한 임시 파일을 사용합니다. 잠금 항목은 일반 파일이어야 하며, 심볼릭 링크·디렉터리·특수 파일은 잠금을 열기 전에 거부합니다. 기록된 스냅샷으로 이어지는 디렉터리는 비공개 상태 저장소 밖에 있는 상위 디렉터리를 포함해 모두 심볼릭 링크가 아닌 실제 디렉터리여야 합니다. 스냅샷 항목 자체도 링크일 수 없습니다. 명시적인 사용자 지정 스냅샷의 별칭은 정규 경로를 기록하기 전에 해석합니다. 정리할 때 모든 구성 요소를 다시 검사하므로 상위 링크를 다른 곳으로 바꿔 재귀 삭제 대상을 바꿀 수 없습니다. 기존 체크아웃이나 스냅샷을 파일 시스템 별칭으로 방문하면 Dojang은 임시 별칭을 저장하지 않고 기존의 안정된 기록 경로를 유지합니다. 저장된 경로는 명시적인 인코딩을 사용해 올바른 UTF-8이 아닌 파일 시스템 고유 경로 값도 보존합니다. 체크아웃, 선언 파일, 중간 경로는 절대 경로여야 하며, 상대 경로 값이 있으면 손상된 레코드로 처리합니다. 관리 대상 원본 경로는 상대 경로여야 하며 상위 디렉터리로 이동하는 요소를 포함할 수 없습니다. 각 관리 대상 기준 사본 경로는 기록된 기준 사본 루트의 실제 하위 경로여야 하며 상위 디렉터리로 이동하는 요소를 포함할 수 없습니다. Dojang은 버전별 필드보다 스키마 버전을 먼저 읽습니다. 따라서 나머지 구조가 현재 릴리스와 달라도 더 새로운 레코드에는 복구 안내 대신 업그레이드 안내를 표시합니다.

기록된 중간 스냅샷이 사라졌거나 일반 파일로 바뀌면 Dojang은 중단합니다. 사라진 공통 조상을 빈 스냅샷으로 간주하지 않습니다.

기존 저장소 마이그레이션

기존 체크아웃에서 마이그레이션을 명시적으로 실행합니다.

$ dojang -r /path/to/dotfiles migrate
Stable repository identity added to /path/to/dotfiles/dojang.toml.
Repository machine state is ready at .../snapshots/current.

먼저 --dry-run으로 파일 작업을 확인할 수 있습니다. 이때 선언, 스냅샷, 상태 저장소는 바뀌지 않습니다.

$ dojang --dry-run -r /path/to/dotfiles migrate
Stable repository identity added to /path/to/dotfiles/dojang.toml.
Repository machine state is ready at .../snapshots/current.
Note: Since --dry-run was specified, those 8 changes were not actually
committed to the filesystem.

머신 상태 루트는 예전 .dojang/ 스냅샷과 겹칠 수 없습니다. Dojang은 경로 별칭을 해석하고 상태 디렉터리를 만들거나 선언에 식별자를 추가하기 전에 이를 검사합니다. XDG_DATA_HOME이나 LOCALAPPDATA 때문에 상태 루트가 .dojang/ 안에 놓인다면 마이그레이션 전에 스냅샷 밖의 플랫폼 기본 데이터 디렉터리를 선택하세요.

마이그레이션은 dojang.toml의 나머지 내용을 다시 쓰지 않고 repository-id를 추가합니다. 갱신된 선언은 같은 디렉터리의 임시 파일에 쓴 뒤 원본과 원자적으로 교체하면서 POSIX 모드 전체를 포함한 기존 파일 권한을 유지합니다. 선언은 올바른 UTF-8이어야 합니다. 해독할 수 없는 바이트가 있으면 원본 파일을 교체하지 않고 마이그레이션을 거부합니다. 선언 파일을 읽거나 원자적으로 교체하지 못하면 종료 코드 11의 선언 파일 오류를 보고하고 원본을 유지합니다. 체크아웃에 예전 .dojang/ 스냅샷이 있으면 외부 저장소로 복사하고 두 사본 전체를 비교한 뒤 상태 레코드를 씁니다. 읽기 전용 선언의 권한은 새 내용을 쓴 뒤에 적용하므로 부모 디렉터리에 쓰기 권한이 있으면 원자적으로 교체할 수 있습니다. 기존 디렉터리는 이 검증이 끝난 후에만 제거합니다. 도중에 중단되면 마이그레이션 마커와 하나 이상의 완전한 사본이 남으므로 같은 명령을 다시 실행하면 됩니다.

마커는 같은 디렉터리의 임시 파일로 쓴 뒤 원자적으로 교체하므로 쓰기가 실패하거나 중단되어도 부분 마커를 노출하지 않습니다. 원본과 목적지를 모두 기록하고 정리가 끝날 때까지 유지됩니다. 마이그레이션할 때 -i/--intermediate-dir를 사용했다면 같은 값으로 다시 실행하세요. Dojang은 다른 재시도 목적지를 어떤 항목도 제거하기 전에 거부합니다. 마커는 일반 파일이어야 합니다. 디렉터리, 심볼릭 링크, 명명 파이프 등 일반 파일이 아닌 항목은 내용을 읽기 전에 손상된 상태로 보고합니다. 목적지에 원본과 일치하는 항목 일부만 있으면 중단된 부분 복사로 인식하고 처음부터 다시 복사합니다. 기존 목적지에 원본과 다른 항목이 하나라도 있으면 마커와 두 사본을 모두 보존하고 충돌 해결을 요청합니다. 상태 레코드나 기존 원본 없이 외부 스냅샷만 있는 경우에도 이를 공통 조상으로 채택하지 않고 거부합니다. 정리 도중 기존 스냅샷의 일부가 이미 제거되었다면, 남은 모든 항목이 완전한 목적지와 일치할 때만 재시도에서 나머지를 제거합니다.

이전 Dojang 버전에서 사용자 지정 중간 디렉터리를 사용했다면 마이그레이션할 때 같은 디렉터리를 지정하세요.

$ dojang -r /path/to/dotfiles -i /path/to/existing-snapshot migrate
Stable repository identity added to /path/to/dotfiles/dojang.toml.
Repository machine state is ready at /path/to/existing-snapshot.

Dojang은 명시적으로 선택한 기존 스냅샷을 검증한 뒤 복사하지 않고 그 위치에서 바로 기록합니다. 이 경우 .dojang/ 디렉터리가 없어도 됩니다. 스냅샷에는 일반 파일과 디렉터리만 있을 수 있습니다. 심볼릭 링크, 명명 파이프, 소켓, 장치 노드는 Dojang이 읽거나 복사하기 전에 거부됩니다. -i를 생략하면 상태 레코드가 없는 기존 외부 스냅샷은 계속 소유자를 확인할 수 없는 것으로 보고 거부합니다.

Dojang은 내용이 같은 두 사본 안에 중첩된 링크를 포함해 스냅샷 안의 심볼릭 링크를 마이그레이션하지 않습니다. .dojang 디렉터리 자체가 심볼릭 링크이면 그 대상의 내용을 읽거나 제거하기 전에 거부합니다. .dojang 경로가 일반 파일 등 디렉터리가 아닌 항목으로 존재해도 스냅샷 부재로 간주하지 않고 거부합니다.

이전 위치와 새 위치에 서로 다른 스냅샷이 있으면 마이그레이션을 거부하고 둘 다 변경하지 않습니다. 두 사본을 보존한 채 올바른 공통 조상을 선택하고, 다른 사본을 제거하거나 옮긴 다음 dojang migrate를 다시 실행하세요. 상태 레코드를 쓴 뒤 정리에 실패했다면 외부 스냅샷을 확인할 때까지 기존 디렉터리를 복구용으로 보관하세요.

예전 ~/.dojang 레지스트리는 마이그레이션 이력을 보존하고 안내를 출력할 때만 인식됩니다. 전역 현재 저장소를 선택하는 데에는 더 이상 쓰이지 않습니다. 손상된 레지스트리는 새 저장소 상태 레코드를 만들기 전에 고치거나 제거해야 하며, 유효한 레코드가 만들어진 뒤에는 무시됩니다. 레지스트리는 심볼릭 링크가 아닌 일반 파일이어야 합니다. 디렉터리, 끊어진 심볼릭 링크 등 일반 파일이 아닌 항목은 내용을 읽기 전에 손상으로 보고합니다. dojang init은 새 저장소를 만들 때 선언이나 경로 규칙 디렉터리를 쓰기 전에 이 검사를 수행합니다. 이미 *.dojang/*이 있는 체크아웃도 거부하며, 기존 스냅샷은 명시적인 dojang migrate를 위해 그대로 둡니다. 유효한 저장소 레코드가 하나뿐이면 마지막 체크아웃에 대해 기록해 둔 경로의 선언 파일이 저장된 repository-id를 사용하는지 확인한 뒤 자동으로 선택합니다. 나중에 지정한 -m/--manifest 값으로 이 소유권 검사를 바꾸지 않습니다. 체크아웃이 사라졌거나 이제 다른 저장소에 속하면 중단하고 -r/--repository-dir로 저장소를 명시하라고 안내합니다. 레코드가 둘 이상인 경우에도 기록된 체크아웃 중 하나가 일시적으로 사라졌는지와 관계없이 저장소를 명시해야 합니다. dojang versiondojang help 같은 메타 명령은 머신 상태 저장소를 열지 않습니다. 저장소를 명시하면 관계없는 다른 저장소 레코드도 탐색하지 않습니다. 절대 경로 선언 파일은 경로를 해석한 결과가 기록된 체크아웃 안에 있을 때만 자동 선택된 체크아웃을 검증할 수 있습니다. 다른 위치의 선언 파일을 사용하려면 -r로 저장소도 명시하세요.

dojang initdojang migrate는 머신 상태 저장소를 검증하지만 등록된 체크아웃을 자동으로 선택하지 않습니다. -r를 생략하면 각 명령은 현재 디렉터리를 사용합니다. --ignore-env-file을 지정한 dojang env는 호스트 환경만 읽으므로 머신 상태 저장소를 열거나 저장소를 선택할 필요가 없습니다.

명시적으로 선택한 체크아웃이 이동한 경우, 예전 경로에 대해 기록해 둔 선언 파일을 읽을 수 있고 그 선언 파일이 같은 repository-id를 계속 사용할 때만 중복 저장소로 처리합니다. 나중에 예전 경로를 차지한 관계없는 데이터는 체크아웃 이동을 막지 않습니다.

예전 레지스트리가 마이그레이션할 체크아웃을 가리키면 최초 적용 완료 상태를 보존합니다. 이 비교 전에 체크아웃 경로의 별칭을 해석합니다. 이전 버전에서 이미 성공적으로 실행한 일회성 훅을 마이그레이션 뒤에 다시 실행하지 않습니다. 동시에 수명 주기 상태를 갱신할 때도 현재 레코드를 다시 읽으므로 예전 스냅샷 경로를 복원하지 않습니다.

동시에 실행한 마이그레이션은 선언의 저장소 식별자를 읽거나 할당하는 동안 같은 잠금을 공유합니다. 따라서 UUID는 하나만 기록되며, 각 프로세스는 저장소 상태를 준비하기 전에 잠금 안에서 그 식별자를 다시 읽습니다.

관리 대상과 고아 레코드

dojang applydojang reflect 명령이 성공하면 Dojang은 실제로 수렴한 항목을 각각 기록합니다. 레코드에는 항목을 만든 경로 규칙과 원본, 절대 경로로 확장된 대상, 그 경로 규칙이 파일과 디렉터리 중 어느 쪽을 관리하는지, 불변 기준 사본, 종류와 SHA-256 지문, 마지막으로 갱신한 명령과 시각, 경로를 정할 때 쓴 환경 정보가 들어갑니다. 레코드에는 경로 규칙이 선언한 종류와 이식 가능한 모드도 보존되어, 이후의 3-방향 비교에 필요한 메타데이터를 호스트 파일 시스템이 우연히 보존해 준 권한 비트에 의존하는 대신 명시적으로 유지합니다. 배포 링크의 레코드에는 링크 대상 문자열 자체를 지문으로 저장합니다. 그 문자열이 곧 기준 사본이며, 이를 위한 파일 시스템 스냅샷은 만들지 않습니다. 대상 식별자는 유효한 유니코드가 아닌 파일 시스템 고유 경로의 정체성도 손실 없이 보존합니다. 대상 경로의 동일성은 운영체제 고유 파일 시스템 규칙을 따릅니다. Windows에서는 대소문자만 다른 경로가 같은 식별자를 공유하고, POSIX 시스템에서는 서로 다른 식별자로 남습니다. 현재 대상이 바뀌었는지 판정할 때도 같은 규칙을 사용합니다. 참조한 환경 변수 값은 원문으로 저장하지 않습니다. 값이 없음과 빈 값을 구분하고, 그 밖의 값은 운영체제 고유 표현을 SHA-256으로 해시해 저장합니다. 유니코드로 해석할 수 없는 서로 다른 값도 같은 해시 입력으로 합쳐지지 않습니다. 여러 항목을 처리하다 중단되면 수렴하지 않은 항목의 기존 레코드는 그대로 둡니다. 처리를 마친 항목만 새 레코드로 바꿉니다. 심볼릭 링크 동기화는 지원하지 않으므로 수렴한 심볼릭 링크를 삭제로 해석하지 않습니다. 대상이 사라진 상태로 수렴한 경우에만 기존 레코드를 제거합니다. 모의 실행은 이 레코드와 최초 적용 이력을 바꾸지 않습니다. 강제 반영으로 이전에 추적하지 않던 무시 대상 항목을 명시적으로 포함한 경우에도 새 관리 대상 레코드를 남깁니다. 인자 없이 전체를 반영하면 다른 항목에 동기화가 필요하더라도 변경 없이 수렴한 경로의 항목까지 모두 기록합니다.

상태를 갱신할 때마다 새 비공개 작업 루트에 기준 사본을 완성한 뒤 레코드를 게시합니다. 복사에 실패하면 기존 레코드와 기준 사본은 그대로 남습니다. 복사가 끝난 뒤 상태 레코드 게시에 실패하면 아직 게시되지 않은 작업 루트를 제거합니다. 같은 경로 규칙 세대의 항목은 한 기준 사본 트리를 함께 쓸 수 있지만, 대상이나 경로 규칙 정의가 바뀌면 다른 트리를 사용합니다. 따라서 나중의 동기화가 예전 고아 레코드의 상태를 판정하는 근거를 덮어쓰지 않습니다. 교체된 기준 사본을 제거하기 전에 접근할 수 없게 될 기준 사본과 중간 경로를 상태 레코드에 기록합니다. 기록할 수 있는 정리 경로는 해당 스냅샷 루트 안으로 제한됩니다. 레코드 게시 뒤 정리에 실패하면 state.toml에 이 기록을 남기고, 다음으로 머신 상태를 사용하는 명령이 같은 저장소 잠금 안에서 다시 시도합니다. 정리가 끝나면 기록과 함께 비어 있는 경로 규칙 세대 디렉터리 및 작업 루트도 제거합니다.

디렉터리 레코드는 디렉터리 항목 자체를 나타냅니다. 그 아래의 관리되는 파일과 디렉터리는 각각의 하위 레코드가 추적합니다. 따라서 상태 확인에서는 무시된 항목이나 나중 작업에서 동기화한 하위 항목까지 디렉터리 레코드 하나로 재귀 비교하지 않습니다.

경로 규칙이 제거되거나 이름이 바뀐 경우, 현재 환경에서 적용되지 않거나 빈 경로가 된 경우, 선택된 정의가 바뀐 경우, 또는 다른 대상 경로로 확장된 경우 기존 레코드는 고아 레코드가 됩니다. 같은 경로 규칙이 파일 관리에서 디렉터리 관리로 바뀌거나 그 반대로 바뀐 경우도 고아 레코드가 됩니다. 디렉터리 경로 규칙이 계속 적용되더라도 이전에 관리하던 항목을 더 이상 만들지 않으면 그 항목의 레코드는 고아가 됩니다. 원본 항목을 제거한 뒤 그 대상을 무시하도록 설정하면 이런 상태가 될 수 있습니다. 일반 적용·반영·상태 확인 명령은 고아 레코드의 대상 파일을 자동으로 삭제하지 않습니다. 현재 대상 경로가 상대 경로이면 이 판정 전에 절대 경로로 해석합니다. dojang status는 각 고아 레코드의 이전 대상 경로, 원본과 경로 규칙, 지문, 이유, 그리고 현재 대상이 변경 없음·수정됨·사라짐 중 어느 상태인지 표시합니다. 대상이나 기준 사본이 명명 파이프·소켓·장치 등 특수 파일이면 내용을 읽지 않고 수정됨으로 판정합니다.

대상 파일은 그대로 두고 고아 레코드 추적만 중단하려면 경로 규칙이나 대상 경로 또는 둘 다를 선택하세요:

$ dojang unmanage --route config
$ dojang unmanage ~/.config/app/config.toml

선택 조건은 합집합으로 적용됩니다. 선택된 레코드는 모두 고아 레코드여야 하므로 아직 활성 상태인 대상은 먼저 선언 파일을 바꾸어야 합니다. 알 수 없는 선택은 상태를 바꾸지 않고 실패합니다. Windows에서는 대상 경로 선택 시 대소문자를 구분하지 않습니다. 변경되지 않았거나 사라진 고아 레코드는 바로 정리할 수 있습니다. 수정된 고아 레코드는 --force가 필요합니다. 기준 사본을 버리면 로컬 변경을 판정할 근거도 함께 사라지기 때문입니다. dojang unmanage는 선택된 레코드와, 어디에서도 참조하지 않는 기준 사본 및 공통 중간 스냅샷의 항목을 제거합니다. 남겨 둔 디렉터리 레코드는 그 하위 항목을 보호합니다. 레코드 게시와 스냅샷 정리는 같은 저장소 잠금 안에서 이뤄지므로, 동시에 실행된 동기화의 레코드를 잃거나 새로 사용 중인 데이터를 지우지 않습니다. 상태를 바꾸기 전에 선택된 레코드와 각각의 현재 상태를 모두 표시합니다. 잠금을 얻은 뒤에도 선택한 식별자가 모두 남아 있는지 확인하고 레코드를 다시 읽어 고아 여부와 수정 여부를 재확인하며, 원본과 대상 파일은 제거하지 않습니다.

한 저장소의 머신별 로컬 상태를 모두 제거하려면 다음 명령을 사용하세요:

$ dojang forget

이 명령은 해당 저장소의 대상 레코드, 중간 스냅샷, 관리 대상 기준 사본, 보존된 병합 작업 영역, 최초 적용 이력을 제거합니다. 머신 식별자, 다른 모든 저장소의 상태, 저장소 원본, 모든 대상 파일은 보존합니다. 수정된 대상이 있으면 --force가 필요합니다. 상태 재확인, 스냅샷 제거, 상태 파일 삭제는 하나의 저장소 잠금 안에서 이뤄집니다. 기록된 중간 스냅샷을 삭제하기 전에 스냅샷 자체나 상위 구성 요소가 심볼릭 링크인지, 체크아웃이나 머신 상태 저장소를 포함하는 경로인지 다시 검사합니다. 비공개 기준 사본 루트를 중간 스냅샷보다 먼저 제거합니다. 검증에 성공하면 두 루트를 삭제하기 전에 승인된 정리를 기록합니다. 따라서 일부 정리에서 기준 사본이 이미 제거됐더라도 --force 없이 다시 실행해 마칠 수 있습니다. 새 요청은 항상 모든 대상을 검사합니다. 승인된 정리가 남아 있는 동안 다른 상태 명령은 중단하고 dojang forget을 다시 실행하라고 안내합니다. 따라서 이전 승인이 나중에 기록된 레코드를 삭제할 수 없습니다. 이미 레코드가 없어도 머신 상태를 만들거나 체크아웃의 기존 .dojang/ 스냅샷을 이전하지 않고 성공합니다. 보존된 병합 작업 영역을 정리해야 한다면 제거 전에 해당 생성 잠금 안에서 머신 식별자나 저장소 레코드가 여전히 없는지 다시 확인합니다. 따라서 동시 상태 생성은 정리 뒤에 시작하며 새로 만든 활성 작업 영역을 잃지 않습니다. 정리 과정에서 state.toml을 삭제한 뒤 승인 마커만 남았다면 dojang forget을 다시 실행할 때 머신 상태를 재생성하지 않고 저장소 잠금 안에서 그 마커를 제거합니다. 같은 저장소 ID를 가진 별개의 체크아웃이 아직 존재하면 기록된 체크아웃의 상태를 삭제할 수 없습니다. 정리에 성공하면 빈 비공개 스냅샷 부모 디렉터리도 제거하므로 자동 저장소 탐색은 이 저장소를 잊힌 상태로 처리합니다. 중단된 마이그레이션 마커와 잊기 마커는 저장소 잠금 안에서 제거합니다. 이전 ~/.dojang 레지스트리가 이 체크아웃을 가리키면 forget은 그 최초 적용 이력도 제거합니다. 다음으로 성공한 적용은 이 저장소의 최초 적용으로 처리됩니다.

다른 중간 디렉터리 선택

-i/--intermediate-dir는 계속 지원됩니다. 지정한 경로는 한 번만 쓰는 일시 재지정이 아니라 저장소 설정으로 저장됩니다. 상대 경로는 저장소 체크아웃을 기준으로 해석합니다. 다른 경로를 다시 명시하기 전까지 이후 명령은 저장된 경로를 사용합니다. .dojang이 마이그레이션 원본인 동안에는 그 하위 경로를 중간 디렉터리로 지정할 수 없습니다. 스냅샷은 체크아웃이나 머신 상태 루트를 포함할 수 없고, 상태 루트 안의 경로는 해당 저장소의 전용 snapshots/ 디렉터리 안에 있어야 합니다. 중간 스냅샷과 비공개 관리 대상 기준 사본 루트는 같은 경로이거나 서로를 포함할 수 없습니다. 이 규칙은 동기화나 이후 정리가 기준 사본 데이터를 중간 파일로 다루거나 저장소 파일 또는 머신 상태 메타데이터를 함께 제거하지 못하게 합니다.

저장된 중간 경로를 바꿀 때도 같은 복사·비교·충돌 규칙이 적용됩니다. 이 옵션으로 지정한 새 경로와 현재 스냅샷 경로는 서로를 포함할 수 없습니다. Dojang은 이 규칙을 확인하기 전에 파일 시스템 별칭을 해석하며, 한 스냅샷의 별칭을 서로 다른 기존 사본으로 간주해 제거하지 않습니다. 검증된 새 사본을 가리키는 상태 레코드가 저장될 때까지 기존 스냅샷을 보존합니다. -i를 생략하면 사용하지 않는 기본 경로가 아니라 실제로 저장된 사용자 지정 경로를 검증합니다. 복사를 시작하기 전에 마이그레이션 마커를 기록하므로 복사가 중단되거나 실패해도 같은 -i/--intermediate-dir 값으로 재시도할 수 있습니다. 목적지에 이미 완전하고 동일한 사본이 있어도 상태 레코드를 갱신하기 전에 마커를 기록합니다. 따라서 정리가 중단되면 다음 실행이 기존 스냅샷 제거를 마칠 수 있습니다. 재시도할 때는 기존 항목이 모두 원본과 일치하는 목적지만 버립니다. 다른 데이터가 있으면 그대로 두고 충돌로 보고합니다. 이 옵션으로 머신 상태를 작업 트리 안에 둘 수도 있지만, 파일 동기화 서비스 같은 전송 수단이 머신별 이력을 다른 기기로 복사할 수 있습니다. 외부 기본 위치는 이 위험을 피합니다.