No description
  • TypeScript 77.8%
  • JavaScript 16.5%
  • CSS 5.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Julian Imhof f6eeca7440
All checks were successful
CI / test (push) Successful in 42m10s
docs: 0.27.1 – an edit of .git/info/exclude refreshes the Changes view
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 18:57:50 +02:00
.forgejo/workflows test: faster suites and CI: compile once, one apt install, cached Chromium 2026-10-11 19:07:48 +02:00
.github/workflows test: faster suites and CI: compile once, one apt install, cached Chromium 2026-10-11 19:07:48 +02:00
.vscode feat: commit graph extension 2026-10-10 15:52:10 +02:00
docs docs: the New Issue screenshot in the dark theme, like the others 2026-10-12 20:04:44 +02:00
media feat: Merge Changes names the conflict's sides, counts the markers left, resolves all at once 2026-10-13 11:39:37 +02:00
src fix: an edit of .git/info/exclude refreshes the views 2026-10-13 18:56:58 +02:00
webview feat: Merge Changes names the conflict's sides, counts the markers left, resolves all at once 2026-10-13 11:39:37 +02:00
.gitignore perf: lane layout in the webview; extension host tests and CI 2026-10-10 16:21:27 +02:00
.vscodeignore build: ESLint, type-aware, in npm test 2026-10-13 11:26:00 +02:00
CHANGELOG.md docs: 0.27.1 – an edit of .git/info/exclude refreshes the Changes view 2026-10-13 18:57:50 +02:00
esbuild.mjs feat: the sidebar as one view with tabs, and an Actions tab with the repository's CI runs 2026-10-12 17:52:40 +02:00
eslint.config.mjs build: ESLint, type-aware, in npm test 2026-10-13 11:26:00 +02:00
LICENSE build: Marketplace metadata, license file, icon, workspace trust 2026-10-11 19:51:57 +02:00
package-lock.json docs: 0.27.1 – an edit of .git/info/exclude refreshes the Changes view 2026-10-13 18:57:50 +02:00
package.json docs: 0.27.1 – an edit of .git/info/exclude refreshes the Changes view 2026-10-13 18:57:50 +02:00
PLAN.md docs: 0.27.0 – Merge Changes names the sides, counts the markers left, resolves all at once 2026-10-13 11:40:15 +02:00
README.md docs: 0.27.0 – Merge Changes names the sides, counts the markers left, resolves all at once 2026-10-13 11:40:15 +02:00
tsconfig.json feat: commit graph extension 2026-10-10 15:52:10 +02:00
tsconfig.webview.json refactor: split the webview script into bundled ES modules 2026-10-10 16:34:25 +02:00

VSGit Graph

A commit graph and a complete replacement for VS Code's Source Control view.

Commit graph with branch labels, avatars and the details of a merge commit

Highlights

  • A commit graph with coloured lanes, branch / tag labels, author avatars, stashes and your uncommitted changes, fast on large histories.
  • A Changes view that does everything the Source Control view does day to day: stage, unstage, discard (also single lines), commit, amend, commit & push, conflicts, stashes, incoming / outgoing commits.
  • History editing without leaving the graph: reword, squash, fixup, interactive rebase, multi-select cherry-pick / revert / squash, undo, and force push with lease afterwards.
  • Works with GitHub, GitLab, Bitbucket, Gitea, Forgejo and Codeberg (including self-hosted): links and avatars everywhere; on GitHub, GitLab, Gitea and Forgejo also open pull requests and CI status on branch labels, and pull / merge requests and releases created from VS Code.
  • Pull requests and issues in tabs of their own: read the conversation, review with line comments, approve, merge, comment, close, create and edit issues, start work on one, all from a Pull Requests & Issues view in the sidebar.
  • Branch comparison, blame (current line, whole file, status bar), line history, bisect, reflog, patches, notes, tag and release actions.
  • A Branches view with remotes, worktrees and cleanup, and a Repositories overview with Fetch All / Pull All for workspaces with many repositories; clone and sparse checkout.
  • One sidebar with tabs: Changes, Graph, Branches, PRs & Issues, Actions and (with more than one repository) Repositories; section headings stay in view while their rows scroll. Each tab keeps its scroll position and selection while you switch; Fetch / Pull / Push sit in the sidebar's title bar, and VSGit: Show … commands jump to a tab.
  • An Actions tab with the repository's latest CI runs (GitHub Actions, GitLab pipelines, Gitea / Forgejo Actions), the running ones on top; a run opens its commit's CI tab.

The sidebar's Changes tab: staged and unstaged files, the commit button, an outgoing commit and a stash at the bottom The Branches tab: the checked-out branch on top with an ahead chip, feature branches in a folder, each with its last commit's subject and age The PRs & Issues tab: my pull requests with their CI state, a review request and assigned issues

An issue in its own tab: the conversation with avatars, and assignees, labels, milestone and branch beside it

Features

Commit graph

  • Lanes with merge curves; lanes are compacted so the graph stays narrow. Avatars (or initials) as commit nodes, the checked-out commit ringed, the uncommitted changes as a dashed node on top.
  • Branch labels: local branches tinted with their lane, the checked-out one solid; remote branches merged into the local label (cloud icon) when in sync; ahead / behind counts; tags; worktree markers. Labels that do not fit open from a +N chip.
  • Stashes as nodes on the commit they were made on; collapse the commits a merge brought in; ancestry highlight dims everything outside the selected commit's first-parent chain.
  • Branch filter: choose which local / remote branches and tags the graph shows, or show only one.
  • Infinite scroll, resizable columns, light / dark / high contrast themes, a sidebar layout and a full editor tab (VSGit: Open Commit Graph in Editor). Column widths, the details pane's size and list / tree view are kept for every window and workspace, as last set.
  • Commits dated ahead of your clock show when ("in 3 days"), not "now".
The sidebar's Graph tab with the details of a merge commit below the graph

Details pane

  • Subject, message (wrapped lines reflowed), author, co-authors, committer, signature status, parents, and the changed files with +/− counts as a list or tree. Expand a file for an inline diff, click it for the diff editor.
  • Compare: Ctrl/Cmd-click a second commit. Multi-select: Ctrl/Cmd-click more, or Shift-click a range, then cherry-pick, revert, squash or copy the SHAs.
  • Compare branches: Compare with Current Branch on a branch or tag label, or VSGit: Compare Branches…. Shows the merge base, the commits only on each side (click one to find it in the graph) and the files the branch changed since the merge base, which is what a pull request would contain. Swap turns the comparison around; Create Pull Request… opens one for the pair.

Changes view (Source Control replacement)

  • Merge conflicts, staged changes and changes (untracked files listed one by one), with stage / unstage / discard / open per file or for all, inline diffs, list or tree.
  • Commit message box shared with the Source Control input box (tools that fill it keep working); the Commit button's menu has Commit & Push and Amend Last Commit. Ctrl+Enter commits.
  • Message guide: the subject's length (a warning past 50 characters, an error past 72) and a hint when the second line is not empty. A Conventional Commits type button (feat, fix, …) sits in the message box's top right corner when the recent history uses that style.
  • Hooks: when a commit hook fails, the error names it and Show Output opens the full output (the "VSGit" output channel logs every failed git command).
  • Conflicts: what Current and Incoming are (the branch merged, the commit picked; for a rebase, the branch rebased onto and your own commit), the kind of conflict and the conflict regions left per file, Open in Merge Editor, Accept Current / Incoming (Keep / Delete File when one side deleted it) per file or for all, Mark as Resolved (asks while markers are left); a banner to continue, skip or abort the merge / rebase / cherry-pick.
  • Stashes (apply / pop / drop, expandable to their files) and Outgoing / Incoming commits (click one to find it in the graph) at the bottom of the view; drag the edge above them to resize them, double-click it for the height they need. Add to .gitignore for untracked files.
  • Branch header with fetch / pull / push / stash / undo; the number of changed files on the Changes tab and as a badge on the activity bar.
  • Stage / Unstage / Discard Selected Lines from editors and diff editors (Ctrl+K Ctrl+Alt+S stages), and single hunks from the inline diffs (buttons on each @@ line).
  • Partial stash: Stash File… in a changed file's context menu, stash buttons on the Staged Changes and Changes sections, and Rename Stash….
  • Submodules (open them in the graph) and Git LFS files are marked.

When git or ssh ask for a username, password, key passphrase or an unknown host key while VSGit runs them, the question shows as an input box or confirmation in VS Code (credential helpers and your own GIT_ASKPASS / SSH_ASKPASS come first).

To hide the built-in view, right-click the Source Control icon in the activity bar and choose Hide. Keep the built-in Git extension enabled: VSGit uses it to find repositories and for credentials when pushing and pulling, and it still draws the gutter markers and Explorer colours.

Actions

  • Context menu on commits and labels: checkout, create branch / tag / worktree, cherry-pick, revert, reset (soft / mixed / hard), merge, rebase, reword, squash into parent, fixup into…, interactive rebase, rename, push, set upstream, delete (local / remote), create pull / merge request, compare with the current branch, copy SHA / message.
  • Tags: push, delete locally or on the remote, Create Release…; VSGit: Push All Tags.
  • Bisect: Bisect: Mark Good / Mark Bad on any commit or label starts a bisect. A banner then shows the revisions left, with Good / Bad / Skip for the checked-out commit and Reset. When git names the first bad commit, a notification offers to show it in the graph.
  • Reflog (toolbar button or VSGit: Show Reflog): where HEAD has been, with commits that no branch reaches any more marked as lost. Bring them back with a branch, reset, checkout or cherry-pick.
  • Double-click a commit or label to check it out; drag a branch label onto another label or commit to merge, rebase, fast-forward or reset; drag a commit (or a multi-selection) onto a branch label to cherry-pick it there.
  • Interactive rebase editor: reorder by drag or Alt+↑/↓, pick / reword / edit / squash / fixup / drop with one key.
  • Undo the last checkout, commit (changes come back staged), amend, merge, rebase, reset, cherry-pick, revert or pull.
  • Rewriting commits that are already pushed (also in the interactive rebase editor) asks first, then offers the force push; so does a rebase continued from the banner that leaves the branch diverged from its upstream.
  • Force Push (with Lease): when a push is refused because the branch's history was rewritten (or from the status bar's menu, a diverged branch's label or VSGit: Force Push (with Lease)…). It asks first, naming how many commits the remote branch loses, and runs --force-with-lease --force-if-includes: the push is refused if the remote branch got commits you have not fetched, or fetched but never looked at. A push refused because the remote is ahead offers Pull, then Push.
  • Patches: Copy as Patch and Save as Patch… on a commit, Save as Patches for a multi-selection (one file, oldest first). VSGit: Apply Patch… (also on .patch / .diff files in the Explorer and in the Changes view's … menu) takes a file or the clipboard: patches made by git format-patch apply as commits (git am --3way, conflicts stop with a banner to continue, skip or abort) or as changes only; a plain diff goes to the working tree, merged three-way when it does not apply as is.
  • Notes: a commit's git notes show below its message; Add Note… and Remove Note are on the commit menu. git never sends notes by itself: Sync Notes with Remote… (palette, or a remote in the Branches view) fetches the remote's notes, merges them with yours (a note changed on both sides keeps both texts, a removed one stays removed) and pushes the result.

Branches and repositories

  • Branches view: local branches with their tip's subject, ahead / behind chips (↓2 ↑1), a gone chip for an upstream deleted on the remote and the age; the checked-out branch on top. Branches sharing a first part (feature/…) are grouped in a folder once two or more do. Remotes with a short URL, tags, and worktrees with their folder and branch; a branch checked out in another worktree has a worktree chip. Its items have the same menus as the graph's labels; clicking one shows it in the graph.
  • Clean Up Branches…: delete branches merged into the main branch (preselected) or whose upstream was deleted.
  • Worktrees: add (pick a branch and a folder), open, remove (asks again when it has changes), prune.
  • Remotes: each one with its URL and branches, also before its first fetch. Add Remote… (the URL is taken from the clipboard when it holds one; fetched at once), Fetch, Rename…, Change URL…, Remove.
  • VSGit: Clone Repository…: URL (from the clipboard), folder (git.defaultCloneDirectory, then the last one used), cancellable; then open it, open it in a new window or add it to the workspace.
  • VSGit: Sparse Checkout…: check out only the folders you pick (cone mode; every folder is offered, type to filter; the files at the top stay), change them later, or check out all files again.
  • Repositories view (with more than one repository open): branch, ahead / behind and changes per repository; click one to select it: the graph, the Changes view, the status bar and the palette's commands all follow that selection. Fetch All / Pull All work on four repositories at a time and can be cancelled; a host that turns out unreachable is not tried again for the rest, Pull All skips repositories on a detached HEAD or without an upstream, and failures are summed up once, grouped by reason, with Retry Failed.
  • Periodic fetch (vsgit.autoFetch): every three minutes (vsgit.autoFetchPeriod) all remotes of every open repository are fetched, while the window has focus. It never asks for a password or passphrase: remotes that would need one are skipped and logged to the VSGit output. With an ssh key that wants a touch (a security key), turn it off.

Search and navigation

  • Ctrl+F searches the shown commits (subjects, authors, refs, hashes) as you type; switch the mode to search the whole history by message (subject and body), author, code change (git log -S) or file name. The .* toggle (Alt+R) takes the query as a regular expression. Hits further back than the loaded history are counted (+N); Enter after the last loaded hit loads history up to the next one.
  • Show File History in Commit Graph (Explorer, editor tab and editor context menus) and Show Line's Commit in Commit Graph (editor context menu).
  • Show Line History in Commit Graph (editor context menu): the graph lists only the commits that changed the selected lines (git log -L) on every branch it shows (with a branch filter, only those). Lines of an edited file are mapped back to the last commit first, then to each branch's version of the file.
  • Inline blame: the line the cursor is on shows who changed it last and when ("You, not committed yet" for edited lines). Hover it for the full message, Show in Commit Graph, Open Diff and Copy SHA. Turn it off with the speech bubble button at the top of the editor, VSGit: Toggle Line Blame or vsgit.blame.currentLine; its colour is the theme colour vsgit.blameForeground.
  • File blame (the person button at the top of the editor, VSGit: Toggle File Blame, also in the editor and tab context menus): age, author and subject next to every block of lines, with a bar coloured by age relative to the file (red is its newest commit, violet its oldest). Hover the annotation for the same card. Word wrap is off while the file blame is on (wrapped rows could not start after the column) and comes back afterwards where the file blame turned it off; whether a file wraps is read from editor.wordWrap. Indent guides are hidden meanwhile.
  • Blame options: vsgit.blame.ignoreWhitespace (git blame -w), and a .git-blame-ignore-revs file is used automatically. Blame Before in the blame card opens the file as of the commit's parent, with the file blame on, to step back past reformats.
  • Status bar: the current line's author (click to find the commit) and the branch with its ahead / behind counts (click to sync, pull, push or fetch). VS Code's Git shows its own blame entry; git.blame.statusBarItem.enabled turns that one off.

Hosting services

  • GitHub, GitLab (with subgroups), Bitbucket, Gitea, Forgejo and Codeberg, including self-hosted instances: commit links, #123 issue links (and GitLab !12 merge requests).
  • Self-hosted Gitea / Forgejo servers are recognised by name, or detected automatically: VSGit asks an unknown remote host's /api/v1/version once (remembered for a week). Anything else can be configured with vsgit.remoteHosts.
  • Avatars from GitHub (by email, co-authors included), GitLab or Gitea / Forgejo, Gravatar otherwise.
  • On GitHub, GitLab, Gitea and Forgejo:
    • Open pull / merge requests as badges on their branches, CI status on branch tips (GitHub checks, GitLab pipeline jobs, Gitea / Forgejo Actions and other commit statuses) and a release badge on tags that have one.

    • CI tab: click a commit's CI status (in the graph or its details, or a check in a pull request tab) for its runs in a tab of their own. The header has the state, branch, total time and job counts, with a bar of the jobs' states along its edge. Workflow runs / pipelines with their jobs, and the selected job's log beside them (below 900 px: the jobs as chips above it), by step with durations and a bar of each step's share of the job's time, in the terminal's colours, groups folded and the failing step opened at its first error. Problems the tools reported (GitHub annotations, compiler messages, ::error commands) are a card above it; their file:line opens the file. While anything runs the tab reads again every few seconds and follows the log. Re-run (failed) jobs and cancel runs where the service allows it (GitHub: all; GitLab: retry, cancel; Gitea / Forgejo: cancel). Open Log as Text shows a log in an editor. GitHub hands out logs only signed in. Gitea / Forgejo name a job's steps on their job page, which VSGit reads for public repositories; otherwise from the runner's markers.

      The CI tab: a commit's runs and jobs beside the failing job, its problems in a card and the failing step open at its error

    • Actions tab of the sidebar: the repository's latest runs, the ones still going on top; a run opens its commit's CI tab.

      The Actions tab: a run in progress, then recent runs that passed, failed or were cancelled
    • Create Pull / Merge Request… in VS Code. It publishes the branch if needed and asks for the base branch (the remote's default first) and the title. A single commit's subject becomes the title; the description is the commit list. Then: create, create as draft, or continue in the browser.

    • Create Release… on a tag. It pushes the tag first. The notes are the commits since the previous tag, or GitHub's generated notes. Publish it, or save it as a pre-release or draft where the service has them.

    • Review Pull Request… (palette, or right-click a badge): fetches the request, from forks too, and shows it against its base with its commits, files and diffs. Approve, Request Changes or Comment from there; check it out as pr/N, or merge it. GitLab has no "request changes" call, so that becomes a comment.

    • Line comments: while reviewing, the diffs opened from the review pane show the request's line comments as comment threads; add comments and replies right there.

    • Pull Requests & Issues tab of the sidebar: My Pull Requests, Review Requested, the other open pull requests, Assigned Issues and the other open issues. Rows show the title and, below it, author, head → base, review state and CI (as the icon), labels and assignees; tooltips add details and an issue's description. Click a pull request or an issue to open it in a tab of its own (below). Check Out, Merge, Open and Copy Link from the row; Start Work on an issue creates a branch like 42-fix-login-crash from the main branch (also from the palette: VSGit: Start Work on Issue…, yours first), and an issue that has such a branch offers Check Out Branch. The status bar shows the current branch's pull request or issue. Hovering #123 anywhere shows the issue's title and state.

    • Pull requests in their own tab: from the view, a branch's pull request badge, a #45 / !45 link or a commit's "merged in" chip. The conversation shows the description, comments and reviews (approved / changes requested) with their line comments and the diff lines they were made on; beside it reviewers with their state, CI checks, assignees, labels, milestone and the branches. A box says where the request stands (checks, approvals, conflicts) with Merge…; below it Comment, Approve and Request Changes. Commits reveal in the graph, Files changed open as diffs of the merge base and the head with the review's line comments. Check Out, Open in Browser and Copy Link sit beside the title.

      A pull request in its own tab: the review with a line comment and its diff, reviewers and CI checks beside it

    • Issues in their own tab: an issue from the view, or a #123 link in a commit or another issue, opens in an editor tab with its text and comments (Markdown), labels, assignees, milestone and branch, a comment box, Close / Reopen, Start Work (or Check Out Branch), Open in Browser and Copy Link. Images in issue and pull request texts show inline (GitHub's uploads of private repositories too); a click opens them. Links in issue texts to other sites are confirmed before they open. With the right to triage the repository, the title (pencil) and assignees, labels and milestone (gears, native pickers) can be changed there. What was read last time shows at once while the tab reads the issue again; while shown, issue and pull request tabs read themselves again every minute (new comments, reviews, CI), keeping your place and draft.

    • New Issue… (the + in the view's title bar): a form with the title, the description (Write / Preview), assignees, labels and milestone; Submit opens the new issue's tab, Submit and Start Work also makes its branch.

      The New Issue form with title, description, assignee, labels and milestone
    • Merge… from the badge's menu: merge commit, squash or rebase, as the service allows. Badges show whether a request is approved or has changes requested.

    • Bitbucket opens its web pages for creating pull requests and releases instead.

  • Reading works without signing in for public repositories (gitlab.com shows comments, discussions and pipelines only to signed-in users; the tabs say so). Private repositories and writing (pull requests, releases, comments, issue edits) need access:
    • GitHub: VS Code's GitHub sign-in (VSGit: Connect GitHub, or asked for when needed).
    • GitLab, Gitea and Forgejo: an access token. VSGit: Set Access Token for Server… stores it, or VSGit asks for one the first time it is needed. Tokens are kept in VS Code's secret storage.
    • GitLab tokens renew themselves: when the stored token is about to expire (within a week, or half its lifetime when that is shorter), VSGit has GitLab revoke it and hand out a new one with the same lifetime from today, while VS Code is open. This needs the api or self_rotate scope, and stops the old token wherever else it is used. VSGit: Rotate GitLab Access Token… rotates it at once.

Keyboard

Where Keys
Graph ↑ ↓ PageUp PageDown Home End move, Shift+↑↓ select a range, ← → collapse / expand a merge, Enter open details / go into them, Shift+F10 or the menu key the commit's menu, Esc clear the selection / close details
Selected row Tab reaches its fold, branch / tag pills, PR badges and "+N"; Enter / Space use them (a pill checks out its branch, like a double-click), the menu key opens a pill's own menu; in the "+N" list arrows move, Esc goes back
Search Ctrl+F search, Enter / Shift+Enter next / previous match, Alt+R regular expression
File lists ↑ ↓ Home End move, ← → collapse / expand, Enter diff, Space stage / unstage, Delete discard
Commit message Ctrl+Enter commit
Rebase editor p r e s f d set the action, Alt+↑↓ move
Editors Ctrl+K Ctrl+Alt+S stage the selected lines

Settings

Setting Default Description
vsgit.maxCommits 1000 Commits loaded at a time (more load while scrolling)
vsgit.dateFormat relative relative or absolute dates
vsgit.graphAvatars true Author avatars as graph nodes (wider lanes)
vsgit.avatars auto auto: GitHub / GitLab avatars when hosted there, Gravatar otherwise. gravatar: Gravatar only. off: initials, no network
vsgit.remoteHosts {} Self-hosted services by host name: github, gitlab, bitbucket, gitea or forgejo, e.g. { "git.example.com": "forgejo" }
vsgit.issueImages true Images in issue and pull request texts; off: they are links
vsgit.autoFetch true Fetch all remotes of every open repository periodically, without prompts
vsgit.autoFetchPeriod 180 Seconds between periodic fetches (at least 60)
vsgit.pullRequests true Pull requests, CI status and releases for GitHub, GitLab, Gitea and Forgejo repositories
vsgit.blame.currentLine true Blame annotation at the end of the current line
vsgit.blame.ignoreWhitespace false Ignore whitespace changes when blaming
vsgit.statusBar.blame true The current line's author in the status bar
vsgit.statusBar.branch true Branch with ahead / behind counts in the status bar
vsgit.commitMessage.conventional auto Conventional Commits type button: auto (when the history uses them), always or never

Privacy

VSGit runs git locally. It only goes online for:

  • Large repositories: when the history loads slowly and git has no commit-graph file, VSGit offers to write one (git commit-graph write, and fetch.writeCommitGraph to keep it current). Nothing goes online for this.
  • Periodic fetch (vsgit.autoFetch, on by default): git fetch --all --prune to the repositories' own remotes, as often as vsgit.autoFetchPeriod says.
  • Avatars (vsgit.avatars): auto sends author and co-author emails to GitHub's or GitLab's avatar service, or MD5 hashes of them to the repository's Gitea / Forgejo server; gravatar sends MD5 hashes to Gravatar; off sends nothing.
  • Pull requests, checks and releases (vsgit.pullRequests): API requests to GitHub, GitLab or the Gitea / Forgejo server for the repository's open pull requests, the CI status of branch tips and its releases; a commit's runs, jobs, annotations and logs while its CI tab is open (every few seconds while something runs, else every minute), re-running and cancelling when you ask.
  • Pull Requests & Issues view (also vsgit.pullRequests): while it is shown, API requests for the repository's open pull requests and issues, their review and CI state, and who you are on the service (only with a sign-in or token); at most once a minute, and after a fetch or push.
  • Issues and pull requests, when you open one: API requests for it and its comments, again every minute while its tab is shown; commenting, closing and reopening when you ask for it. The issues and pull requests you opened are kept in VS Code's storage for this extension (the last 200), so their tabs open at once, as is the status bar's pull request / issue of each repository's branch; VSGit: Clear Cached Issues and Pull Requests removes them.
  • Images in issues and pull requests (vsgit.issueImages): loaded from where the text links them; on GitHub through its image proxy (or the signed URL of an upload), so other sites don't see your address. Off: images are links, and nothing is loaded from the texts.
  • Creating, reviewing and merging pull requests, and releases, when you ask for it: API requests to the service. Badges also ask for the review state of requests for branches in view.
  • GitLab access tokens, with a stored token: at most twice a day, along with other requests to the server, one asking GitLab when the token expires and, when it is about to, one rotating it.
  • Host detection: one request to /api/v1/version on remote hosts VSGit does not recognise, to find self-hosted Gitea / Forgejo servers.
  • Fetch / pull / push, through VS Code's Git extension; clone and adding a remote (which fetches it) with git itself.

In an untrusted folder (Restricted Mode) VSGit stays off: git runs programs a repository configures (hooks, fsmonitor, diff and merge drivers), so it only runs in folders you trust.

Development

npm install
npm run compile            # tsc + esbuild; npm run watch rebuilds on change
npm test                   # unit tests, webview tests (jsdom), webview type check and ESLint
npm run lint               # ESLint alone (type-aware for src/)
npm run test:integration   # extension host tests; set VSCODE_EXECUTABLE to use a local VS Code
npm run test:integration:offscreen  # the same in a headless Wayland compositor (cage), no window
npm run test:visual        # layout checks in headless Chromium (CHROME_BIN, or Playwright's
                           # chromium-headless-shell); skipped without one
npm run test:all           # all three after one compile (extension host tests offscreen)
npm run screenshots        # renders docs/*.png from a fictional demo repository
npm run package            # build a .vsix (earlier ones are deleted)

Press F5 in VS Code to start an Extension Development Host. PLAN.md records the roadmap and what was built when; CHANGELOG.md lists the releases.

Layout

Extension host (src/, compiled with tsc to out/):

  • extension.ts, actions.ts, commands.ts – commands and context menu actions; ui.ts – all dialogs (scriptable in tests)
  • sidebar.ts – the activity bar's webview with its tabs (webview/sidebar.js); treeTab.ts – tree tabs drawn by webview/tree.js
  • graphView.ts, graphController.ts, graphHandlers.ts, graphHtml.ts – the commit graph webview
  • changesView.ts – the Changes tab; wip.ts, partialStaging.ts – staging, commits, selected lines
  • git.ts – git CLI wrapper; repoState.ts – repository state with few processes and caching; serial.ts – one load at a time; busy.ts – progress
  • askpass.ts, askpassMain.ts, credentials.ts – git and ssh prompts in VS Code; autoFetch.ts, runAll.ts – periodic fetch, Fetch All / Pull All
  • graph.ts – lane layout (also bundled into the webview); rows.ts – WIP / stash / folded-merge rows
  • history.ts, rebaseEditor.ts – history edits and the interactive rebase editor; forcePush.ts
  • patches.ts, lineHistory.ts, sparse.ts, notes.ts – patches, line history, sparse checkout, notes sync
  • hosts.ts, hostSettings.ts – hosting services and their detection; avatars.ts
  • forge.ts (API access, tokens), github.ts, gitlab.ts, gitea.ts – pull requests, checks and releases; gitlabToken.ts – token rotation; commitPr.ts – a commit's pull request; pullRequests.ts, releases.ts – creating them; ciRuns.ts, ciLogs.ts, ciPanel.ts – the CI tab: runs, job logs; actionsView.ts – the sidebar's Actions tab
  • blame.ts, lineBlame.ts, fileBlame.ts, statusBar.ts – blame and status bar
  • review.ts, reviewComments.ts – pull request review and line comments; issues.ts; workItems.ts, workItemsView.ts – the Pull Requests & Issues tab; issueDetails.ts, issuePanel.ts, issueEdit.ts, markdown.ts – the issue tab; issueForm.ts – New Issue; pullDetails.ts, pullPanel.ts – the pull request tab; detailsCache.ts – their cache
  • branchesView.ts, branchCommands.ts, remotes.ts, reposView.ts – Branches and Repositories tabs; clone.ts
  • bisect.ts, reflog.ts, commitGraph.ts; output.ts – errors and the output channel
  • filters.ts, repositories.ts, contentProvider.ts, services.ts, testHooks.ts

Webviews (webview/, bundled by esbuild.mjs to out/webview/, type-checked with npm run check:webview):

  • main.js (graph), changes.js (Changes view), sidebar.js (sidebar tabs), rebase.js (rebase editor), ciPage.js, issuePage.js, issueFormPage.js, pullPage.js (editor tabs) – entry points
  • core.js, util.js, states.js, dropdown.js, updating.js – shared state, helpers, empty / error states, menus, refresh indicator
  • rows.js, columns.js, interaction.js, dnd.js, refPop.js, search.js, toolbar.js, bisect.js – graph
  • details.js, files.js, message.js – details pane, file lists, inline diffs, commit composer and message guide
  • tree.js – tree tabs; ci.js, issue.js, pull.js – CI, issue and pull request pages
  • media/ – stylesheets and the icon; docs/ – screenshots (npm run screenshots)

License

MIT