No description
Find a file
ClaudiaFang 4eebebc765 feat: show new feature tips after update
Adds a "what's new" modal shown once after the plugin updates to a new
version, so users don't miss what changed:

- New src/changelog.ts: a hand-curated CHANGELOG array (distinct from
  the auto-generated CHANGELOG.md, which lists every commit) where
  entries can be marked `notable` so they're called out separately
  from minor fixes, per the issue's clarification comment.
- New src/utils/version.ts: compareVersions() does numeric per-segment
  comparison (so "1.10.0" sorts after "1.9.0", unlike a plain string
  compare).
- getUnseenReleases() filters+sorts the changelog to what's newer than
  a given "last seen" version, extracted as a pure/testable function
  rather than inlined in main.ts (which isn't unit-tested in this repo).
- New settings field lastSeenVersion, persisted the same way as other
  settings. On a fresh install (empty lastSeenVersion) it's just
  recorded silently — no modal, since there's nothing to compare
  against. On an actual version bump, WhatsNewModal shows the unseen
  releases' highlights, with a "View full changelog" link out to
  CHANGELOG.md and a "Got it" dismiss; the version is recorded either
  way so the tip only ever shows once per upgrade.
- The whole check is wrapped in try/catch so a malformed version
  string can never break plugin startup.

Closes #39
2026-07-13 13:56:38 +00:00
.agents/skills chore(skills): install clean-code, design-taste-frontend, frontend-design skills 2026-07-05 05:15:47 +00:00
.claude feat: support hidden file sync and expand binary extension list 2026-05-22 03:08:15 +00:00
.github/workflows ci: remove advanced CodeQL workflow in favor of default setup 2026-07-07 02:41:00 +00:00
.husky feat: integrate SyncConflictModal into SyncManager 2026-04-01 16:43:10 +00:00
archive chore: add agent harness (state, verification, lifecycle tracking) 2026-07-13 12:27:42 +00:00
docs feat(sync): real symbolic link support (GitHub) with configurable handling 2026-06-28 05:14:35 +00:00
imgs docs: update intro video with refreshed content 2026-06-19 11:59:00 +00:00
scripts build(compat): derive the compat typecheck's target version dynamically 2026-07-07 01:53:28 +00:00
src feat: show new feature tips after update 2026-07-13 13:56:38 +00:00
tests feat: show new feature tips after update 2026-07-13 13:56:38 +00:00
.editorconfig Initial commit 2026-04-01 00:23:18 +08:00
.gitignore build(compat): derive the compat typecheck's target version dynamically 2026-07-07 01:53:28 +00:00
.npmrc Initial commit 2026-04-01 00:23:18 +08:00
.releaserc.json fix(ci): switch to shared workflow v1 and fix repository url 2026-06-16 03:53:29 +00:00
AGENTS.md chore: add agent harness (state, verification, lifecycle tracking) 2026-07-13 12:27:42 +00:00
CHANGELOG.md chore(release): 1.2.1 [skip ci] 2026-07-07 02:45:25 +00:00
CLAUDE.md chore: add agent harness (state, verification, lifecycle tracking) 2026-07-13 12:27:42 +00:00
esbuild.config.mjs Initial commit 2026-04-01 00:23:18 +08:00
eslint.config.mts feat: support hidden file sync and expand binary extension list 2026-05-22 03:08:15 +00:00
feature_list.json chore: add agent harness (state, verification, lifecycle tracking) 2026-07-13 12:27:42 +00:00
fix_order.mjs fix: enable automatic versioning and sync manifest to 1.1.0 2026-04-24 18:32:29 +00:00
init.sh chore: add agent harness (state, verification, lifecycle tracking) 2026-07-13 12:27:42 +00:00
LICENSE docs: overhaul README and add Traditional Chinese usage guide 2026-04-24 17:33:19 +00:00
manifest.json fix(compat): support Obsidian down to 1.11.0 2026-07-07 01:53:28 +00:00
package-lock.json build(compat): derive the compat typecheck's target version dynamically 2026-07-07 01:53:28 +00:00
package.json build(compat): derive the compat typecheck's target version dynamically 2026-07-07 01:53:28 +00:00
pr_body.md fix: resolve SonarCloud Quality Gate failures and improve marketplace readiness (#10) 2026-04-25 23:35:32 +08:00
progress.md chore: add agent harness (state, verification, lifecycle tracking) 2026-07-13 12:27:42 +00:00
README.md docs: restyle README, host demo videos on R2, use official download stats (#44) 2026-07-06 10:31:33 +08:00
ruleset_update.json refactor: fix quality gate issues, improve type safety and pagination (#21) 2026-04-27 02:16:26 +08:00
session-handoff.md chore: add agent harness (state, verification, lifecycle tracking) 2026-07-13 12:27:42 +00:00
skills-lock.json chore(skills): install clean-code, design-taste-frontend, frontend-design skills 2026-07-05 05:15:47 +00:00
sonar-project.properties fix: resolve SonarCloud Quality Gate failures and improve marketplace readiness (#10) 2026-04-25 23:35:32 +08:00
styles.css feat: show new feature tips after update 2026-07-13 13:56:38 +00:00
targeted_append.mjs chore: update author to ClaudiaFang and repo name to git-files-sync 2026-04-24 18:46:31 +00:00
tsconfig.json fix: resolve obsidian community guidelines and lint errors 2026-04-25 03:13:04 +00:00
USAGE_zh.md docs: restyle README, host demo videos on R2, use official download stats (#44) 2026-07-06 10:31:33 +08:00
version-bump.mjs fix: resolve obsidian community guidelines and lint errors 2026-04-25 03:13:04 +00:00
versions.json fix(compat): support Obsidian down to 1.11.0 2026-07-07 01:53:28 +00:00
vitest.config.ts fix: SonarCloud analysis failure and quality gate issues 2026-04-25 06:10:55 +00:00

Git File Sync

Selective, file-by-file sync between your vault and GitHub, GitLab, or Gitea.

CI Release Downloads License

Releases · 繁體中文使用說明 · Changelog

Push, pull, diff, and resolve conflicts — file by file, not whole-vault. Unlike full-vault sync solutions, Git File Sync gives you granular control over exactly what leaves your device, so you can keep personal notes private while sharing project files through a real Git repository.

GitHub GitLab Gitea

sync-status The Sync Status View gives a bird's-eye view of your vault, letting you selectively push, pull, or diff modified files.

What's inside

  • File-by-file control — Sync individual notes or whole folders, not your entire vault. No lock-in to a single sync provider for everything.
  • Three Git providers — GitHub, GitLab (including self-hosted), and Gitea, all behind one consistent UI.
  • Visual diffing — A built-in diff viewer compares local and remote versions side-by-side before anything is overwritten.
  • Conflict resolution — When local and remote both changed, resolve manually with a dedicated conflict tool instead of guessing which version wins.
  • Works on mobile — Full support for Obsidian Mobile with a touch-friendly sync dashboard.

Sync Status View

A single dashboard shows the state of every tracked file:

  • Status filtering — instantly see what's modified, new, or missing.
  • Visual diffs — line-by-line comparison of local vs. remote before syncing.
  • Remote-only detection — spot files that exist on GitHub/GitLab/Gitea but haven't been pulled into the vault yet.

conflict The built-in diff viewer compares local and remote changes before you push or pull.

Providers

Provider Hosting Min. version
GitHub github.com · GitHub Enterprise
GitLab gitlab.com · self-hosted GitLab 13.0+
Gitea self-hosted Gitea 1.12+

Gitea note: the plugin talks to the Gitea API v1 (/api/v1) and resolves branch names to commit SHAs before fetching the file tree, which is what makes 1.12+ the floor.

Configuration

Plugin Settings Pick a provider and supply its credentials in Settings > Git File Sync.

Provider Required info Token scope
GitHub GitHub Personal access token, owner, repo name repo
GitLab GitLab Personal access token, project ID, base URL api
Gitea Gitea Personal access token, base URL, owner, repo name (all)
  • GitHub token: Settings → Developer settings → Personal access tokens → repo scope.
  • GitLab token: User settings → Access tokens → api scope. Base URL defaults to https://gitlab.com; change it for self-hosted instances.
  • Gitea token: User settings → Applications → Access tokens. Point the base URL at your instance (e.g. https://gitea.example.com).

Other settings: branch to sync against (default main), root path prefix inside the repo, vault folder to scope which notes are tracked, and symbolic link handling (real — recreate the link, GitHub only; follow — sync the target's content; skip). See Symbolic link handling for details.

Daily workflow

Pushing:

  • One note — the cloud icon in the ribbon, or the command Push current file to GitLab/GitHub/Gitea.
  • Several notes — open the Sync Status View, filter to Modified, select files, click Push selected.
  • From the file tree — right-click any file and choose Push to GitLab/GitHub/Gitea.

Pulling:

  1. Open the Sync Status View and click Refresh status.
  2. Files with remote updates show as Modified or Remote only.
  3. Select them and click Pull selected. Pulling overwrites local changes — if both sides changed, the conflict tool opens instead.

Resolving a conflict:

  1. The Conflict Resolution window opens automatically.
  2. Left pane is your Local version, right pane is Remote.
  3. Choose Keep Local (overwrite remote on next push) or Keep Remote (accept remote, overwrite local).

On mobile: swipe from the left to open the ribbon and the Sync Status View, pull before you start editing, push when you're done.

Installation

  1. Open Settings > Community plugins and turn off restricted mode.
  2. Click Browse, search for Git File Sync, click Install, then Enable.

Manual

  1. Download main.js, manifest.json, and styles.css from the latest release.
  2. Create <vault>/.obsidian/plugins/git-file-sync/.
  3. Copy the three files into that folder.
  4. Reload Obsidian and enable the plugin under Settings > Community plugins.

Quick start

  1. Configure a provider in Settings > Git File Sync (see Configuration).
  2. Open the Sync Status View — the list icon in the ribbon, or run Open sync status view from the Command Palette.
  3. Click Refresh status to compare your vault against the remote repo.
  4. Select files and Push selected or Pull selected as needed.

Commands:

Command What it does
Open sync status view Open the sync dashboard
Push current file to GitLab/GitHub/Gitea Push the active note
Pull current file to GitLab/GitHub/Gitea Pull the active note
Push all files Push every tracked, changed file
Pull all files Pull every tracked, changed file

Privacy and security

  • Local storage — personal access tokens are stored locally in the plugin's data folder inside your vault, and are only ever sent to the Git provider you configured.
  • No telemetry — the plugin collects no usage data or analytics.

Requirements

  • Obsidian 1.13.0 or later
  • Desktop and mobile supported

Development

git clone https://github.com/firstsun-dev/git-files-sync.git
npm install

npm run dev    # watch build
npm run build  # type-check + production build
npm run test   # vitest suite
npm run lint   # eslint

License

MIT


Created by ClaudiaFang