diff --git a/app/src-tauri/src/commands/file_commands.rs b/app/src-tauri/src/commands/file_commands.rs index 83bc5e7..200b082 100644 --- a/app/src-tauri/src/commands/file_commands.rs +++ b/app/src-tauri/src/commands/file_commands.rs @@ -206,8 +206,10 @@ pub async fn download_container_backup( // so secrets can't leak through the sanitization fallback. // The `--transform` nests the workspace under `workspace/` (parallel to // `home-claude/`) so an extracted archive has both clearly labeled instead - // of scattering the workspace files into the extraction dir. `flags=r` - // scopes the rewrite to member names only, leaving symlink targets intact. + // of scattering the workspace files into the extraction dir. `flags=rh` + // rewrites regular member names AND hardlink target names (so an intra- + // workspace hardlink pair still resolves on extract) while leaving symlink + // targets untouched (rewriting those would corrupt relative/absolute links). let script = r#"set -e STAGE=$(mktemp -d) trap 'rm -rf "$STAGE"' EXIT @@ -225,7 +227,7 @@ if [ -d "$HOME/.claude" ]; then fi tar czf - --ignore-failed-read \ --exclude='*/node_modules' --exclude='*/target' \ - --transform='flags=r;s,^\./,workspace/,' \ + --transform='flags=rh;s,^\./,workspace/,' \ -C "$TC_BACKUP_SRC" . \ -C "$STAGE" home-claude"#;