Comparison between rustic and restic

Note that we regularly update this document to compare the latest versions of rustic and restic. Currently, we compare restic 0.17.1 with rustic 0.9.1.

General differences

resticrustic
programming languageGoRust
test coverage❌ (46% in rustic_core)
config profile support❌ (wrapper tools available)
lockinglock files in repositorylock-free operations, two-phase pruning
cold storage❌ (no direct support, may work in special cases)✅ (full support including warm-up of needed data)
in-repo config✅ (see below for details)
logging-v or --quiet--log-level
allow to log to file
returns error code(✅) only 0 or 1; not all commands support it
available as library✅ rustic_core
interactive mode (TUI)

Storage backends

backendresticrustic
local✅ (built-in)✅ (built-in)
sftp✅ (using external ssh command)✅ (built-in using opendal, windows not supported)
rest✅ (built-in)✅ (built-in)
s3✅ (built-in)✅ (built-in using opendal)
swift✅ (built-in)✅ (built-in using opendal)
b2✅ (built-in)✅ (built-in using opendal)
azure✅ (built-in)✅ (built-in using opendal)
gs✅ (built-in)✅ (built-in using opendal)
dropbox✅ (built-in using opendal)
ftp✅ (built-in using opendal)
gdrive✅ (built-in using opendal)
onedrive✅ (built-in using opendal)
webdav✅ (built-in using opendal)
opendal (other services)✅ (built-in using opendal)
rclone✅ (via stdin, using external rclone command)✅ (via http on localhost, using external rclone command)

Commands

commandresticrustic
backup
cache
cat
config❌ (no in-repo config)
check
copy
diff
dump
find
forget
generatecompletions
init
key list
key add
key remove
key passwd
list
ls
merge
migrate❌ (not needed; repo version migration via config)
mount❌ (WIP)
prune
recover
repair index
repair packs
repair snapshots
repoinfo
restore
rewrite
self-update
show-config
snapshots
stats❌ (but there is repoinfo)
tag
unlocklock-free
webdav

Information saved in snapshots

informationresticrustic
from repo design info
program version used
summary (size,…)
used command
label
description
delete (protection)

General options

optionresticrustic
--cacert
--cache-dir✅ (or in config profile)
--cleanup-cache
--compression✅ (auto,max,off); needed in every call✅ (-7..22) configure once in in-repo config
--dry-run✅ (or in config profile)
--insecure-no-password✅ (empty passwords work without extra option)
--insecure-tls
--json
--key-hint
--limit-download❌ (for opendal option trottle)
--limit-upload❌ (for opendal option trottle)
--log-file✅ (or in config profile)
--no-cache✅ (or in config profile)
--no-extra-verify✅ needed in every call✅ configure once using config
--no-lock✅ all operations are lock-free
--no-progress✅ (or in config profile)
--progress-intervall✅ (via env variable)✅ (or in config profile)
--option✅ as cmd arg or env variable✅ via config profile or env variable
--pack-size✅ fix limit; needed in every call✅ fix or dynamic limit, configure once in in-repo config
--password-command✅ (or in config profile)
--password-file✅ (or in config profile)
--quiet
--repo✅ (or in config profile)
--repo-hot❌ (no cold-storage support)✅ (or in config profile)
--repository-file❌ (use repository in config profile instead)
--retry-locknot needed; lock-free
--tls-client-cert
--use-profile❌ (no config profile support)✅ (or in config profile for recursively using profiles)
--verbose (multiple times)--log-level
--warm-up❌ (no cold-storage support)✅ (or in config profile)

rustic in-repo config options

optionresticrustic
append_only
compression✅ (by --compression)
treepack_size❌ (only all packs: --pack-size)
treepack_growfactor
treepack_size_limit
datapack_size❌ (only all packs: --pack-size)
datapack_growfactor
datapack_size_limit
min_packsize_tolerate_percent❌ (hardcoded 80% for prune --repack-small)
max_packsize_tolerate_percent
extra_verify✅ (default, can be unset using --no-extra-verify)✅ (default)

Snapshot filtering

filterresticrustic (options also in config profile)
by host--host--filter-host
by label--filter-label
by paths--paths--filter-paths
by exact pathlists--filter-paths-exact
by tags--tags--filter-tags
by exact tagists--filter-tags-exact
by date/time--filter-before, filter-after
by size--filter-size
by size added to repo--filter-size-added
custom--filter-fn (using Rhai)

Comparison of important commands

init

optionresticrustic
--copy-chunker-params(not needed, use copy --init)
--from-*(not needed, see copy command)
--hostname❌ (always sets hostname)
--repository-version✅ (use --set-version)
--set-*❌ (no in-repo config support)
--username❌ (always sets username)
--with-created❌ (always sets creation time)

backup

generalresticrustic
allow to create multiple snapshot in single run
allow to backup relative paths
optionresticrustic (options also in config profile)
--as-path
--command
--custom-ignorefile
--description
--description-from
--delete-never
--delete-after
--exclude--glob
--exclude-file--glob-file
--exclude-caches❌ (use --exclude-if-present)
--exclude-if-present✅ (+ support for header parsing)✅ (but no header parsing)
--exclude-larger-than
--files-from
--files-from-raw
--files-from-verbatim
--force
--git-ignore❌ (roadmap: 0.19)
--group-by✅ (host/paths/tags)✅ (host/label/paths/tags)
--host
--iexclude--iglob
--iexclude-file--iglob-file
--ignore-ctime
--ignore-inode
--ignore-devid
--init
--label
--no-require-git❌ (no --git-ignore)
--no-scan
--one-file-system
--parent
--read-concurrency❌ (hardcoded)
--skip-if-unchanged--skip-identical-parent
--stdin✅ (use - as backup source)
--stdin-filename
--stdin-from-command
--tag
--time
--with-atime

restore

generalresticrustic
scan and use already existing files
resumable restore
restore hard links
<snapshotID>:<subfolder> syntax
<snapshotID>:<subfolder>/file syntax
dry run support
optionresticrustic
filtering options for latest
--delete
--exclude--glob
--iexclude--iglob
--iinclude--iglob
--include--glob
--no-ownership
--numeric-id
--overwrite❌ (missing functionality: if-newer, never)
--sparse
--target✅ (give target as second CLI argument)
--verify❌ (but diff can be used to verify after)
--verify-existing--overwrite always

dump

generalresticrustic
dump files
dump dirs
optionresticrustic
snapshot filtering options for latest
--archive❌ (no dumping of dirs)

forget

generalresticrustic
allow to keep all XXX
respect “no delete” options in snapshot
optionresticrustic (options also in config profile)
snapshot filtering options
--keep-last
--keep-daily
--keep-weekly
--keep-monthly
--keep-quarter-yearly
--keep-half-yearly
--keep-yearly
--keep-within
--keep-within-hourly
--keep-within-daily
--keep-within-weekly
--keep-within-monthly
--keep-within-quarter-yearly
--keep-within-half-yearly
--keep-within-yearly
--keep-tag
--usafe-allow-remove-all✅ –keep-none`
--compact
--group-by✅ (host/paths/tags)✅ (host/label/paths/tags)
--prune

prune

generalresticrustic
prune plan without reading pack files
prune parallel to backup (two-phase prune)❌ (roadmap: 0.19)
different pack sizes for tree/data packs
resumable prune
(option to) resize packs
optionresticrustic
--fast-repack
--instant-delete✅ (default, no two-phase)
--keep-pack
--keep-delete❌ (no two-phase)
--max-repack-size--max-repack (size/%/unlimited)
--max-unused
--repack-all
--repack-cacheable-only
--repack-small✅ (default behavior; to unset use --no-resize)
--repack-uncompressed
--unsafe-recover-no-free-space--early-delete-index

check

generalresticrustic
check index files
check index vs packs
check snapshot files
(optionally) check pack files
only check given snapshots
cache policycreate temporary (use existing: roadmap 0.18)use existing
check cache integrity
check hot/cold integrity❌ (no cold storage support)
optionresticrustic
--read-data
--read-data-subset
--trust-cache❌ (no cache integrity check)
--with-cache✅ (default behavior)

copy

generalresticrustic
source/target given byCLI optionsin config profile
multiple targets
check for matching chunker parameters
optionresticrustic
snapshot filtering options
--from-*✅ (target is --repository)✅ (source is --repository, target in config profile)
--init❌ (extra run of init --copy-chunker-params)

snapshots

generalresticrustic
summarize identical snapshots (like +3)
show summary information (sizes)
optionresticrustic
snapshot filtering options
--all
--compact
--group-by✅ (host/paths/tags)✅ (host/label/paths/tags)
--latest
--long

ls

optionresticrustic
snapshot filtering options for latest
--glob
--glob-file
--human-readable
--iglob
--iglob-file
--long
--numeric-uid-gid
--summary
--recursive

find

generalresticrustic
group and sort snapshots by date before finding
summarize snapshots with identical result (like +3)
fast searching for given full paths
optionresticrustic
--all❌ (no summarizing)
--blob
--glob✅ (give patterns as args)
--group-by
--ignore-case✅ (--iglob)
--long❌ (default: long output)
--newest(✅) use --filter-before
--numeric-uid-gid❌ (default: numeric ids)
--oldest✅ use --filter-after
--pack
--path (filter snapshots)--filter-path
--path (full path to search)
--show-pack-id
--show-misses
--snapshot✅ (give ids as args)
--tag--filter-tags
--tree

diff

generalresticrustic
allow latest
diff with local files
<snapshotID>:<subfolder> syntax
<snapshotID>:<subfolder>/file syntax
optionresticrustic
snapshot filtering options for latest❌ (no latest support)
--glob
--glob-file
--iglob
--iglob-file
--metadata
--no-content
exclude options for local files❌ (no diff with local files)
Last change: 2024-10-14, commit: 231e5b0