Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
f0243fe
Streamline mount/unmount for dehydrating folders
tyrielv Dec 18, 2025
30802f9
Clean up error logging
tyrielv Jan 8, 2026
7001b6b
PR feedback
tyrielv Jan 9, 2026
fa32180
Replace some git config calls with libgit2
tyrielv Jan 13, 2026
80f5df6
PR feedback
tyrielv Jan 14, 2026
8ccb768
Streamline mount/unmount for dehydrating folders
tyrielv Jan 15, 2026
05d0118
Merge pull request #1897 from tyrielv/tyrielv/avoid-git-config-process
tyrielv Jan 15, 2026
a5e262e
Workaround libgit2 safe.directory case mismatch bug
tyrielv Jan 29, 2026
d8d3fc2
Disable hydration status for -s/--short
tyrielv Feb 11, 2026
133c5d3
Merge pull request #1902 from tyrielv/tyrielv/hydration-s
tyrielv Feb 19, 2026
99a689c
Add last timestamp to TryDownloadPrefetchPacks success telemetry
tyrielv Feb 23, 2026
6c7a5dd
Expand missing prefetch mitigation usage
tyrielv Feb 24, 2026
455b6c1
Merge pull request #1904 from tyrielv/tyrielv/prefetch-telemetry
tyrielv Feb 25, 2026
6edff55
Replace LruCache with MissingTreeTracker to further optimize lookups
tyrielv Feb 26, 2026
4c7e7bc
MissingTreeTracker - use Trees for capacity, track multiple commits p…
tyrielv Feb 26, 2026
2b7fdcb
Fix tests
tyrielv Feb 26, 2026
a90175f
Add telemetry
tyrielv Feb 26, 2026
41fb847
build(deps): bump actions/upload-artifact from 6 to 7
dependabot[bot] Mar 2, 2026
964dc87
build(deps): bump actions/download-artifact from 7 to 8
dependabot[bot] Mar 2, 2026
2aa96a4
Merge pull request #1907 from microsoft/dependabot/github_actions/act…
dscho Mar 2, 2026
f44d708
Merge pull request #1906 from microsoft/dependabot/github_actions/act…
dscho Mar 2, 2026
abea3ba
Replace safe.directory functional test with unit tests
tyrielv Mar 3, 2026
e620f45
Relax IsDevelopmentVersion to accept any major version 0
tyrielv Mar 4, 2026
9d3a09b
Move pre-mount validation from gvfs.exe to gvfs.mount.exe
tyrielv Mar 3, 2026
a917f38
Parallelize pre-mount validations with network operations
tyrielv Mar 3, 2026
2d48281
Combine auth initialization with config query
tyrielv Mar 4, 2026
c8298bd
dehydrate: default to per-folder dehydration, add --full flag
tyrielv Mar 4, 2026
129adcd
Fix duplication of GitCoreGVFSFlags
Mar 5, 2026
3349dcd
Merge pull request #1909 from tyrielv/tyrielv/relax-dev-version
tyrielv Mar 5, 2026
9408de7
Merge pull request #1910 from tyrielv/tyrielv/dehydrate-wildcard-folders
tyrielv Mar 9, 2026
717137d
Merge pull request #1908 from tyrielv/tyrielv/faster-mount
tyrielv Mar 9, 2026
4b3bc38
Merge pull request #1899 from tyrielv/tyrielv/safedirectory-caseinsen…
tyrielv Mar 9, 2026
1355af2
common: add worktree detection and enlistment support
Mar 11, 2026
02e218c
hooks: make pipe name resolution worktree-aware
Mar 11, 2026
1b64954
mount: teach gvfs mount/unmount to handle worktrees
Mar 11, 2026
729aa7b
hooks: auto-mount/unmount worktrees via git hooks
Mar 11, 2026
9a1b98b
tests: add worktree unit and functional tests
Mar 11, 2026
47073cc
hooks: block worktree creation inside VFS working directory
Mar 12, 2026
b5e5ca5
hooks: check mount status before worktree remove
Mar 12, 2026
820d04e
hooks: harden block of nested worktrees
tyrielv Mar 16, 2026
d695489
Improve exception logging and telemetry for hydration status
tyrielv Mar 16, 2026
ebac74c
Add circuit breaker for hydration status
tyrielv Mar 16, 2026
e88b403
Add CancellationToken and async hydration to GitStatusCache
tyrielv Mar 16, 2026
7064548
hooks: fix index copy race and vfs-hook script cleanup
Mar 17, 2026
7379c1a
mount: wrap RepoMetadata init/shutdown in try/finally
Mar 17, 2026
768e8e1
hooks: fix MAX_PATH overflow and simplify unmount wait
Mar 17, 2026
fcaae15
common: store enlistment root in worktree gitdir, remove path assumpt…
Mar 17, 2026
3a243c1
misc: restore unmount log path, API compat overload, narrow catch
Mar 17, 2026
47fd827
tests: fix worktree cleanup to use gvfs unmount
Mar 17, 2026
6d69ca9
tests: concurrent worktree creation, commit, and removal
Mar 17, 2026
0606c95
Add mount lock to prevent concurrent mount race condition
tyrielv Mar 18, 2026
2db7629
Merge pull request #1914 from tyrielv/tyrielv/hydration-status-3-canc…
tyrielv Mar 18, 2026
6cbd3dc
Merge pull request #1905 from tyrielv/tyrielv/extend-prefetch-mitigation
tyrielv Mar 18, 2026
1be9cdb
Merge upstream/master into tyrielv/hydration-status-1-itracer
tyrielv Mar 18, 2026
03418be
Merge branch 'master' into tyrielv/hydration-status-2-circuit-breaker
tyrielv Mar 18, 2026
39d3282
Merge pull request #1913 from tyrielv/tyrielv/hydration-status-2-circ…
tyrielv Mar 18, 2026
4e30816
functional tests: add dev mode for running without admin
Mar 18, 2026
820341d
Merge pull request #1912 from tyrielv/tyrielv/hydration-status-1-itracer
tyrielv Mar 18, 2026
0000e6e
Merge pull request #1916 from tyrielv/tyrielv/dev-func-tests
tyrielv Mar 18, 2026
fe3444f
Replace git ls-tree with projection-based folder count
tyrielv Mar 19, 2026
dbf1b1b
Fix whitespace
tyrielv Mar 20, 2026
9aa9eda
Fix corruption when unstaging changes made by git commands
Mar 20, 2026
d4546ac
Address PR feedback: proper exit codes and error classification for m…
Mar 23, 2026
daf6d46
Apply skip-worktree/merge-state filter to CountIndexFolders fallback …
tyrielv Mar 23, 2026
0ae14cd
Merge pull request #1915 from tyrielv/tyrielv/concurrent-mount
tyrielv Mar 23, 2026
1ef345c
Merge pull request #1917 from tyrielv/tyrielv/hydration-status-4-proj…
tyrielv Mar 23, 2026
998a230
Merge remote-tracking branch 'upstream/master' into tyrielv/gvfs-work…
Mar 23, 2026
2bee9a3
Address PR #1856 review feedback: fix fail-open, tree-ish parsing, pa…
Mar 23, 2026
1cf5fea
Merge pull request #1856 from tyrielv/restore-repro-test
tyrielv Mar 23, 2026
8da26bc
build(deps): bump microsoft/setup-msbuild from 2.0.0 to 3.0.0
dependabot[bot] Mar 24, 2026
4a11096
Merge pull request #1921 from microsoft/dependabot/github_actions/mic…
tyrielv Mar 24, 2026
a1ba896
Replace process spawn with IPC for hydration status in hooks
tyrielv Mar 19, 2026
544c4ac
Add PowerShell version of RunFunctionalTests-Dev
tyrielv Mar 23, 2026
64dc7b2
Merge pull request #1919 from tyrielv/tyrielv/hydration-status-5-ipc
tyrielv Mar 24, 2026
5924add
Merge branch 'master' of https://github.com/microsoft/VFSForGit into …
tyrielv Mar 25, 2026
7c1ba07
Merge pull request #1920 from tyrielv/tyrielv/fix-dev-test-cleanup
tyrielv Mar 25, 2026
4fb56b4
Fix git restore after deleting directory with nested subdirs
tyrielv Feb 4, 2026
121f0cc
build: add run_name input to support cross-repo automation
mjcheetham Mar 27, 2026
44b6d6b
Merge pull request #1926 from mjcheetham/ci-workflow-customname
mjcheetham Mar 27, 2026
ff944c1
Merge pull request #1900 from tyrielv/tyrielv/delete-folder-then-rest…
tyrielv Mar 27, 2026
d933fae
Address PR feedback from mjcheetham and KeithIsSleeping
Mar 27, 2026
752ed29
Update default GIT_VERSION in build workflow
mjcheetham Mar 27, 2026
6a508c5
Merge pull request #1925 from microsoft/ci-gitver-bump
mjcheetham Mar 30, 2026
073d7e9
Set checkout.workers config on gvfs clone and mount
Mar 27, 2026
6a5d79b
Add circuit breaker, connection timeout, and pool contention telemetry
tyrielv Mar 31, 2026
579f483
Coalesce concurrent download requests for the same object
tyrielv Mar 27, 2026
cddda1c
Merge pull request #1929 from tyrielv/tyrielv/oom-request-coalescing
tyrielv Apr 1, 2026
4b91931
Merge pull request #1930 from tyrielv/tyrielv/oom-circuit-breaker-tim…
tyrielv Apr 1, 2026
2b0a797
ci: separate Git and GVFS installation
mjcheetham Mar 30, 2026
e7e46dc
ci: extract functional tests into reusable workflow
mjcheetham Mar 30, 2026
3e26fc6
ci: parameterise functional tests workflow for cross-repo use
mjcheetham Mar 30, 2026
f3ab63d
Merge pull request #1932 from microsoft/reuse-fts
mjcheetham Apr 1, 2026
a401916
build: emit skipped-run link as an annotation
mjcheetham Apr 1, 2026
064524b
Merge pull request #1933 from mjcheetham/notice-workflow
mjcheetham Apr 1, 2026
6c7c170
ci: allow different repo for downloading GVFS/FT artifacts
mjcheetham Apr 2, 2026
750df8c
Merge pull request #1934 from mjcheetham/fix-workflow
mjcheetham Apr 2, 2026
43ff0ed
Increase HTTP connection pool size and add config override
tyrielv Apr 2, 2026
f07bf41
Add 'gvfs cache' verb to display shared cache info
tyrielv Mar 25, 2026
a1f7ff4
Merge pull request #1927 from tyrielv/tyrielv/checkout-workers
tyrielv Apr 3, 2026
42cbc3c
Merge pull request #1928 from tyrielv/tyrielv/oom-connection-pool-size
tyrielv Apr 3, 2026
c3b4a19
Merge pull request #1924 from tyrielv/tyrielv/gvfs-cache-verb
tyrielv Apr 3, 2026
78bf3c1
Merge upstream/master
tyrielv Apr 7, 2026
579de94
ci: bump to microsoft/git v2.53.0.vfs.0.6
mjcheetham Apr 7, 2026
a496389
Merge pull request #1935 from microsoft/msgitbump
tyrielv Apr 7, 2026
6d9400f
Merge upstream/master
tyrielv Apr 7, 2026
d4b4bbc
common: single-quote core.virtualfilesystem for paths with spaces
tyrielv Apr 7, 2026
31312ad
Merge pull request #1911 from tyrielv/tyrielv/gvfs-worktree-2
mjcheetham Apr 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
180 changes: 66 additions & 114 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
name: VFS for Git

run-name: ${{ inputs.run_name || 'VFS for Git' }}

on:
pull_request:
branches: [ master, releases/shipped ]
Expand All @@ -11,12 +13,17 @@ on:
description: 'Microsoft Git version tag to include in the build (leave empty for default)'
required: false
type: string
run_name:
description: 'Optional display name for this run (used for cross-repo automation)'
required: false
type: string

permissions:
contents: read
actions: read

env:
GIT_VERSION: ${{ github.event.inputs.git_version || 'v2.50.1.vfs.0.1' }}
GIT_VERSION: ${{ github.event.inputs.git_version || 'v2.53.0.vfs.0.6' }}

jobs:
validate:
Expand Down Expand Up @@ -93,7 +100,10 @@ jobs:
}
}

if (run.status === 'completed' && run.conclusion === 'success') return run.html_url
if (run.status === 'completed' && run.conclusion === 'success') {
core.notice(`Skipping: There already is a successful run: ${run.html_url}`)
return run.html_url
}
}
return ''
} catch (e) {
Expand All @@ -116,6 +126,48 @@ jobs:
-Tag $env:GIT_VERSION && `
Write-Host ::notice title=Validation::Using microsoft/git version $env:GIT_VERSION

- name: Download microsoft/git installers
if: steps.check.outputs.result == ''
shell: cmd
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release download %GIT_VERSION% --repo microsoft/git --pattern "Git*.exe" --dir MicrosoftGit

- name: Create Git install script
if: steps.check.outputs.result == ''
shell: cmd
run: |
>MicrosoftGit\install.bat (
echo @ECHO OFF
echo SETLOCAL
echo.
echo IF "%%PROCESSOR_ARCHITECTURE%%"=="AMD64" ^(
echo SET GIT_ARCH=64-bit
echo ^) ELSE IF "%%PROCESSOR_ARCHITECTURE%%"=="ARM64" ^(
echo SET GIT_ARCH=arm64
echo ^) ELSE ^(
echo ECHO Unknown architecture: %%PROCESSOR_ARCHITECTURE%%
echo exit 1
echo ^)
echo.
echo FOR /F "tokens=* USEBACKQ" %%%%F IN ^( `where /R %%~dp0 Git*-%%GIT_ARCH%%.exe` ^) DO SET GIT_INSTALLER=%%%%F
echo.
echo SET LOGDIR=%%~dp0\logs
echo IF EXIST %%LOGDIR%% ^( rmdir /S /Q %%LOGDIR%% ^)
echo mkdir %%LOGDIR%%
echo.
echo ECHO Installing Git ^(%%GIT_ARCH%%^)...
echo %%GIT_INSTALLER%% /LOG="%%LOGDIR%%\git.log" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /ALLOWDOWNGRADE=1
)

- name: Upload microsoft/git installers
if: steps.check.outputs.result == ''
uses: actions/upload-artifact@v7
with:
name: MicrosoftGit
path: MicrosoftGit

build:
runs-on: windows-2025
name: Build and Unit Test
Expand Down Expand Up @@ -150,7 +202,7 @@ jobs:

- name: Add MSBuild to PATH
if: steps.skip.outputs.result != 'true'
uses: microsoft/setup-msbuild@v2.0.0
uses: microsoft/setup-msbuild@v3.0.0

- name: Build VFS for Git
if: steps.skip.outputs.result != 'true'
Expand All @@ -167,139 +219,39 @@ jobs:
shell: cmd
run: src\scripts\CreateBuildArtifacts.bat ${{ matrix.configuration }} artifacts

- name: Download microsoft/git installers
if: steps.skip.outputs.result != 'true'
shell: cmd
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release download %GIT_VERSION% --repo microsoft/git --pattern "Git*.exe" --dir artifacts\GVFS.Installers

- name: Upload functional tests drop
if: steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: FunctionalTests_${{ matrix.configuration }}
path: artifacts\GVFS.FunctionalTests

- name: Upload FastFetch drop
if: steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: FastFetch_${{ matrix.configuration }}
path: artifacts\FastFetch

- name: Upload installers
- name: Upload GVFS installer
if: steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: Installers_${{ matrix.configuration }}
name: GVFS_${{ matrix.configuration }}
path: artifacts\GVFS.Installers

functional_test:
runs-on: ${{ matrix.architecture == 'arm64' && 'windows-11-arm' || 'windows-2025' }}
functional_tests:
name: Functional Tests
needs: [validate, build]

strategy:
matrix:
configuration: [ Debug, Release ]
architecture: [ x86_64, arm64 ]
nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 10 parallel jobs to speed up the tests
fail-fast: false # most failures are flaky tests, no need to stop the other jobs from succeeding

steps:
- name: Skip this job if there is a previous successful run
if: needs.validate.outputs.skip != ''
id: skip
uses: actions/github-script@v8
with:
script: |
core.info(`Skipping: There already is a successful run: ${{ needs.validate.outputs.skip }}`)
return true

- name: Download installers
if: steps.skip.outputs.result != 'true'
uses: actions/download-artifact@v7
with:
name: Installers_${{ matrix.configuration }}
path: install

- name: Download functional tests drop
if: steps.skip.outputs.result != 'true'
uses: actions/download-artifact@v7
with:
name: FunctionalTests_${{ matrix.configuration }}
path: ft

- name: ProjFS details (pre-install)
if: steps.skip.outputs.result != 'true'
shell: cmd
run: install\info.bat

- name: Install product
if: steps.skip.outputs.result != 'true'
shell: cmd
run: install\install.bat

- name: ProjFS details (post-install)
if: steps.skip.outputs.result != 'true'
shell: cmd
run: install\info.bat

- name: Upload installation logs
if: always() && steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@v6
with:
name: InstallationLogs_${{ matrix.configuration }}_${{ matrix.architecture }}-${{ matrix.nr }}
path: install\logs

- name: Run functional tests
if: steps.skip.outputs.result != 'true'
shell: cmd
run: |
SET PATH=C:\Program Files\VFS for Git;%PATH%
SET GIT_TRACE2_PERF=C:\temp\git-trace2.log
ft\GVFS.FunctionalTests.exe /result:TestResult.xml --ci --slice=${{ matrix.nr }},10

- name: Upload functional test results
if: always() && steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@v6
with:
name: FunctionalTests_Results_${{ matrix.configuration }}_${{ matrix.architecture }}-${{ matrix.nr }}
path: TestResult.xml

- name: Upload Git trace2 output
if: always() && steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@v6
with:
name: GitTrace2_${{ matrix.configuration }}_${{ matrix.architecture }}-${{ matrix.nr }}
path: C:\temp\git-trace2.log

- name: ProjFS details (post-test)
if: always() && steps.skip.outputs.result != 'true'
shell: cmd
run: install\info.bat

ft_results:
runs-on: ubuntu-latest # quickest runners
name: Functional Tests
needs: [functional_test]

strategy:
matrix:
configuration: [ Debug, Release ]
architecture: [ x86_64, arm64 ]

steps:
- name: Success! # for easier identification of successful runs in the Checks Required for Pull Requests
run: echo "All functional test jobs successful for ${{ matrix.configuration }} / ${{ matrix.architecture }}!"
uses: ./.github/workflows/functional-tests.yaml
with:
skip: ${{ needs.validate.outputs.skip }}

result:
runs-on: ubuntu-latest
name: Build, Unit and Functional Tests Successful
needs: [functional_test]
needs: [functional_tests]

steps:
- name: Success! # for easier identification of successful runs in the Checks Required for Pull Requests
run: echo "Workflow run is successful!"
run: echo "Workflow run is successful!"
Loading
Loading