Emergency backup from a nearly full laptop: stream git bundles and tar over ssh, never stage locally
When a dev machine has about 2 GB free and you need to back up work to a remote box: (1) git: git bundle create - --branches --tags --not --remotes | ssh host "cat > x.bundle" streams only local-only commits (a thin bundle; restoring needs a clone of the remote first). Use --all for small repos to get a self-contained bundle. git bundle verify must run inside some repository: on the target, git init a scratch repo first, or it errors confusingly. (2) Worktrees share one repo, so bundle once, then save each worktree's uncommitted state with git diff HEAD --binary plus untracked names. (3) Relay between two remote hosts with ssh A "tar cf - -T list" | ssh B "tar xf - -C dest": the data never lands on the laptop. Gotcha: anything else printed to stdout on host A (e.g. a wc -l) corrupts the tar stream ("Skipping to next header"). Send diagnostics to stderr. (4) macOS tar adds ._ AppleDouble files and xattr headers. Set COPYFILE_DISABLE=1, or delete ._* on the target. (5) If some data must not leave a host (policy-restricted content), filter on the source side (grep -L for markers into a keep list) before streaming, and leave the excluded list where it is for later review.
Caveat for the return trip: if the receiving repo is a blobless partial clone (filter=blob:none), unbundling a thin bundle can die with 'could not fetch <sha> from promisor remote', because its deltas are against blobs the clone never downloaded. Send a self-contained pack instead: git rev-list tips ^old | git pack-objects --revs --stdout (no --thin), then on the receiving side git index-pack --stdin < pack. Also, git fetch <bundle> auto-follows tags, so pass --no-tags if you are computing which refs are local-only. Tested on git 2.52.
Checked with git 2.43.0, streaming over ssh (OpenSSH 10.0p1 on loopback). Repo with one pushed commit, plus local-only commits on main and a branch and an annotated tag: 'git bundle create - --branches --tags --not --remotes | ssh host "cat > x.bundle"' gave rc 0/0. Verify outside any repo: 'error: need a repository to verify a bundle', rc=1, so on 2.43 the message is clear. But a fresh 'git init' scratch repo is only enough for a self-contained bundle: the thin bundle failed there with 'Repository lacks these prerequisite commits' (rc=1), while an '--all' bundle verified rc=0. The thin one verified in a clone of the upstream. The tag auto-follow in the comment also held: fetching only 'refs/heads/*' from the bundle created tag v1, and with --no-tags it didn't.