0.6.3
Native Git Bridge 0.6.3
This release needs the runner reinstalled in Termux (v13): open the companion app and use Update runner, or run the install command from Settings. Copy main.js and styles.css when updating by hand.
Sync can always finish
A file changed here and on the remote no longer traps sync. Git refuses to merge over uncommitted changes to a file the merge also touches — whether or not the content would conflict — and sync used to stop there forever. It now asks git which paths the merge brings in, and commits first only when they collide with local work; an ordinary sync is unchanged and produces no merge commit. A real disagreement becomes a normal conflict, which the panes already resolve per block.
Merges no longer disturb the sparse checkout. A merge has to materialise excluded files to merge them; sync and pull now put the sparse state back afterwards, so the safety gate no longer blocks the very operation that created those files.
Filenames other machines cannot check out are caught before they are committed. A long Cyrillic or emoji name commits and pushes cleanly from Android, and then every other clone fails with "Filename too long". Sync and commit now check every file against the limits other systems enforce, list the offenders, and offer to shorten the names automatically — through Obsidian's own rename, so links keep working.
See what Termux is doing
A new output panel shows git's own output while it runs. Tap the state line in the git panel or the history panel (or use the command palette) during any operation. The runner streams its progress as it works, so a clone or a repair shows transfer percentages instead of a bare seconds counter, and a wait can be read against the request's budget.
Three log tabs, left of the refresh button: earlier operations (kept 24 hours), the Termux runner log, and the plugin's own operation log — each in a dark console field, in both themes. The panel opens on the live operation and never opens empty.
The state line reads the same on every panel, with the runner's current step on its own line under it, so the layout never jumps when the runner starts talking.
Repairing a damaged repository
Android routinely kills Termux mid-write, and the residue is an object store git cannot read: object file … is empty, unable to read tree. The repair for that state was rebuilt end to end.
It runs as short steps instead of one long action, so an interrupted repair loses one step, not the whole run, and a repair interrupted by closing Obsidian offers to continue on the next launch.
It downloads what is missing, not the history. The targeted step asks the remote for the missing objects by name — measured at kilobytes against a multi-gigabyte vault. Downloading the whole history again is a separate step and always asks first.
It tells the truth about local-only damage. Missing objects that survive a full refetch and belong to unpushed commits were never on the remote; no download can bring them back, and re-cloning would throw those commits away. The repair now says so and offers Rebuild on the remote state instead: the branch moves to what the remote has, every file on disk stays exactly as it is, the content of the local commits becomes ordinary uncommitted changes for the next sync, and the old history stays reachable under a backup branch. The panel offers to delete the backup once you have checked nothing is lost, and reminds about it daily until it is gone.
Fixes
- "Abort merge failed" now explains itself and offers Reapply sparse rules, which is the actual way out when the sparse checkout drifted from the index.
- Short operation timeouts no longer condemn healthy bridges. Network operations get a 120-second floor whatever the setting says, and the bridge check names the likely cause first instead of sending you to reinstall a working runner.
- Tokens cannot reach logs or the vault. A personal access token travels as the URL's username, and the redaction only knew the
user:passwordform; every log, result and progress stream now strips any userinfo and the token shapes the hosts issue. Credential configuration is passed to git on the command line and never written into a file inside the vault. - A conflict looks like a conflict on every surface, the context menu names the file it is about, a rename reveals as three readable lines, and deleting to Obsidian's trash is no longer presented as a move.
- The status panel never presents an unread repository as clean, budgets its rows on huge vaults, and a result that arrived while Obsidian was closed is reported instead of dropped.
- The shareable log bundle collects the plugin log, the runner log and the recent progress streams into one file, redacted, for reporting a problem.
Full Changelog: 0.6.2...0.6.3