setup
Prepare SSH hosts before go / drive.
julia --project=. -m DistSSHKit setup [options] [child:NAME]
# Repeat child:NAME for more hosts. (:N ignored). parent is `up`, not setup.From Julia, use setup! for the same modes as this CLI (:delete, :rsync, :clone, :instantiate, :check, :runtest, :prune, …), or the shorter sync! / instantiate! aliases (API, First Steps · Prepare). The Julia channel is up, not a setup mode. The setup parser still accepts --juliaup and --juliaup-update; they do the same work as up / up update. setup!(session, :clone) requires an explicit repo= URL (clone runs on the remote).
Also: Requirements, setup --help. Flag vocabulary: User Guide.
rsync or git?
--rsync— just sends your local files as-is; no git needed on the remote. Good for a first try or a one-off run. The tree is the directory that holds the Manifest Pkg reads, so a workspace member also sends that parent.--projecton workers stays the member, andgoruns in that directory. A lock outside that tree, a symlink to such a lock, or a lock outside the git work tree for--clone/--sync, fails before instantiate.--clonethen--sync— manages the remote as a git repository. The clone lands on the git work tree root, placed so the Manifest directory is the same deploy root--rsyncuses. Better if you're updating the code continuously, or you wantdrive --require-gitto confirm the remote commit matches your local one for reproducibility.
Flags
Pick one mode per invocation (except shared options).
--check: localssh/rsync/giton PATH; remotes: SSH, Julia, project, deps; git commit parity when remotes have.git/. A missing local git commit is a warning (instantiate still proceeds), not a fail--clone:git cloneonto each remote at an empty/missing path (confirm unless-y)--rsync: rsync local tree onto missing/empty path (recommended first deploy; no remote.git/; confirm unless-y)--sync: localgit push, thengit pullon remotes (git workflows; confirm unless-y)--pull:git pullon laptop first, then remotes (no push; confirm unless-y)--instantiate:Pkg.instantiateon remotes after deployup/up update: not a setup flag. Seeup.up child:NAMEandup parentrunadd/update/default.up updaterunsjuliaup updateand leaves the default--runtest:Pkg.test()of the job project on remotes (not DistSSHKit's tests)--prune: delete.distsshkit/{go,drive,setup,runs}leaves on localhost (job project) and remotes.--confirm-pathequal to the remote path deletes without a prompt. Without it, the command asks forprune.-yandDISTSSHKIT_YESstill skip that prompt and delete. That skip stops in DistSSHKit 0.11 (DistSSHRun 0.2). Does not--deletethe deploy tree.--older-than DAYS(mtime).--id TOKEN(go batch orruns/<kind>/<leaf>name contains TOKEN; skips drive/setup)--cleanup: kill stale Julia worker processes (local + remotes; untaggedjulia --worker/--bind-to. Drive leftover pkill isjob_id-tagged only;DISTSSHKIT_SKIP_GLOBAL_WORKER_PKILL=1skips that)--delete: remove the remote tree.--confirm-pathequal to the computed path deletes without a prompt. Without it, the command asks fordelete.-yandDISTSSHKIT_YESstill skip that prompt and delete. That skip stops in DistSSHKit 0.11 (DistSSHRun 0.2). A git checkout removes the clone destination when that path sits above the deploy root. A--remote-paththat cannot express that parent, and a tree with no git work tree, remove the rsync deploy root.--repo URL: clone URL (default: localorigin)--remote-path PATH: remote repo root (alias--remote-dir; orDISTRIBUTED_REMOTE_PROJECT_ROOT)--julia PATH: Julia on remotes (default: auto /JULIA_DISTRIBUTED_EXE)--ignore-julia-version: warn instead of fail on major.minor mismatch-q/--quiet: hide terminal detail; kit log under.distsshkit/setup/still written--progress: live status (TTY default)--verbose: full detail (non-TTY default)-y/--yes: accept confirmation prompts non-interactively. For--deleteand--prune, this still skips the prompt. That skip stops in DistSSHKit 0.11 (DistSSHRun 0.2)--confirm-path PATH: run--delete(the computed remote path) or--prune(the remote path) without the typed prompt. Quote a path that contains~(--confirm-path '~/Parent/Repo') so the shell does not expand it. Repeat is not needed; one match is enough. A mismatch exits 1 and deletes nothing--hosts CSV: comma-separatedchild:NAME[:N](:Nstripped).parent/parent:Nbelong toup, notsetup--hosts-file PATH: append the same tokens (:Nstripped)-v/--version: print DistSSHKit version and exit-h/--help: full help
--clone / --rsync never overwrite a nonempty remote path; use --delete first to replace. DISTSSHKIT_JOBS (default 1) may rsync several hosts at once. Non-quiet setup and setup! print a Time table with a row per host (rsync/host, …). Replay with julia -m DistSSHKit progress .distsshkit/setup.
Remote path
Default: ~/Parent/RepoName from the local tree. Override with --remote-path or DISTRIBUTED_REMOTE_PROJECT_ROOT (same ENV for go / drive).
~ is fine for setup shell ops (rsync / clone / check). Before kit-parent-side collect / path math, DistSSHKit expands ~ on each SSH host to an absolute path. Prefer an absolute remote root when you can.
After --rsync
No remote .git/ — that is fine. go / drive do not pre-run sync or require git parity by default. go --rsync / drive --rsync on an empty path instantiate if deps are still missing. Setup logs: {project}/.distsshkit/setup/. setup --rsync skips .distsshkit/ even if the job .gitignore is missing.