• v0.6.0 b9f6055759

    v0.6.0 Pre-Release

    simonfranken released this 2026-10-22 10:44:43 +00:00 | 17 commits to main since this release

    Sixth release of submarine. Still a prototype, but the first one that changes your repositories: x restores a submodule, or the whole project, to exactly what git records. It also adds a problems-only view and no longer fetches on startup.

    Highlights

    • Restore (x). Makes the selected submodule, and every submodule below it, exactly what git records: tracked files reset, untracked files and leftover repositories removed, merges and rebases ended, missing submodules cloned or initialized again (also inactive ones and ones set to update = none). With the header selected it restores the superproject itself, so one key gives you the exact project your root commit specifies.
    • Restore never moves a branch: a checkout that is off its pin is detached first, so commits stay on their branch. Ignored files (.env, node_modules, build output) are kept.
    • Restore asks only if work would be lost: changed or untracked files, a merge/rebase in progress, commits that no branch or remote reaches, or a repository that exists nowhere else. The question lists what is discarded; y restores, any other key cancels. Without a loss it just runs.
    • Staged pins are kept at every depth. A nested submodule with a staged pin and uncommitted changes keeps the pin and is reset to it. On a submodule with a staged pin, x asks whether to restore to the staged pin (s) or the committed pin (c, which unstages it).
    • Problems only (!). Shows only submodules with an issue (or an unknown state), plus their ancestors, expanded. It combines with the filter and says problems only above the footer, so a short list is not mistaken for a healthy repository.
    • The superproject is selectable. The header is its row: it is selected on startup, shows its own state (changed, unpushed, …) and has a detail pane like a submodule. A leftover clone of a submodule the branch no longer has shows up as an untracked repository.
    • No fetch on startup. With hundreds of submodules the automatic fetch was too much. The header and the detail pane show when you last fetched (also fetches made in other shells); f fetches everything.

    Changes to be aware of

    • The --no-fetch flag is removed, since nothing is fetched on startup. Scripts that pass it now fail with "flag provided but not defined". The update check is still off for dev builds, --mock and SUBMARINE_NO_UPDATE_CHECK=1.
    • Restore is the first action that uses the network besides f: it may clone a missing submodule or fetch a missing commit. It never prompts (passwords, passphrases and host-key questions fail with git's message instead).
    • The placeholder keys u (checkout pin) and b (bump pin) are removed.

    Install

    curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh
    

    Installs submarine and the alias sub (linux/macOS, amd64/arm64) to ~/.local/bin. Update from 0.5.0 with submarine update.

    Binaries and checksums.txt are published in the package registry (generic package submarine, version v0.6.0).

    Known limitations

    • Restore shows restoring … with a spinner, but no progress per repository, so a restore with many clones takes a while without feedback.
    • There is no way yet to stage a pin from submarine (planned, see docs/actions.md).
    • Restore is not available on the mock data (--mock).
    Downloads