Skip to content

Conversation

@dscho
Copy link
Member

@dscho dscho commented Nov 17, 2025

After all the -rc rebases, this is the real rebase.

Kevin Willford and others added 30 commits November 17, 2025 19:13
While performing a fetch with a virtual file system we know that there
will be missing objects and we don't want to download them just because
of the reachability of the commits.  We also don't want to download a
pack file with commits, trees, and blobs since these will be downloaded
on demand.

This flag will skip the first connectivity check and by returning zero
will skip the upload pack. It will also skip the second connectivity
check but continue to update the branches to the latest commit ids.

Signed-off-by: Kevin Willford <[email protected]>
Ensure all filters and EOL conversions are blocked when running under
GVFS so that our projected file sizes will match the actual file size
when it is hydrated on the local machine.

Signed-off-by: Ben Peart <[email protected]>
This adds hard-coded call to GVFS.hooks.exe before and after each Git
command runs.

To make sure that this is only called on repositories cloned with GVFS, we
test for the tell-tale .gvfs.

2021-10-30: Recent movement of find_hook() to hook.c required moving these
changes out of run-command.c to hook.c.

2025-11-06: The `warn_on_auto_comment_char` hack is so ugly that it
forces us to pile similarly ugly code on top because that hack _expects_
that the config has not been read when `cmd_commit()`, `cmd_revert()`,
`cmd_cherry_pick()`, `cmd_merge()`, or `cmd_rebase()` set that flag. But
with the `pre_command()` hook already run, that assumption is incorrect.

Signed-off-by: Ben Peart <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
The idea is to allow blob objects to be missing from the local repository,
and to load them lazily on demand.

After discussing this idea on the mailing list, we will rename the feature
to "lazy clone" and work more on this.

Signed-off-by: Ben Peart <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
Suggested by Ben Peart.

Signed-off-by: Johannes Schindelin <[email protected]>
Hydrate missing loose objects in check_and_freshen() when running
virtualized. Add test cases to verify read-object hook works when
running virtualized.

This hook is called in check_and_freshen() rather than
check_and_freshen_local() to make the hook work also with alternates.

Helped-by: Kevin Willford <[email protected]>
Signed-off-by: Ben Peart <[email protected]>
Verify that the core.hooksPath configuration is repsected by the
pre-command hook. Original regression test was written by
Alejandro Pauly.

Signed-off-by: Matthew John Cheetham <[email protected]>
If we are going to write an object there is no use in calling
the read object hook to get an object from a potentially remote
source.  We would rather just write out the object and avoid the
potential round trip for an object that doesn't exist.

This change adds a flag to the check_and_freshen() and
freshen_loose_object() functions' signatures so that the hook
is bypassed when the functions are called before writing loose
objects. The check for a local object is still performed so we
don't overwrite something that has already been written to one
of the objects directories.

Based on a patch by Kevin Willford.

Signed-off-by: Johannes Schindelin <[email protected]>
When using the sparse-checkout feature, the file might not be on disk
because the skip-worktree bit is on. This used to be a bug in the
(hence deleted) `recursive` strategy. Let's ensure that this bug does
not resurface.

Signed-off-by: Kevin Willford <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
The 'git worktree' command was marked as BLOCK_ON_GVFS_REPO because it
does not interact well with the virtual filesystem of VFS for Git. When
a Scalar clone uses the GVFS protocol, it enables the
GVFS_BLOCK_COMMANDS flag, since commands like 'git gc' do not work well
with the GVFS protocol.

However, 'git worktree' works just fine with the GVFS protocol since it
isn't doing anything special. It copies the sparse-checkout from the
current worktree, so it does not have performance issues.

This is a highly requested option.

The solution is to stop using the BLOCK_ON_GVFS_REPO option and instead
add a special-case check in cmd_worktree() specifically for a particular
bit of the 'core_gvfs' global variable (loaded by very early config
reading) that corresponds to the virtual filesystem. The bit that most
closely resembled this behavior was non-obviously named, but does
provide a signal that we are in a Scalar clone and not a VFS for Git
clone. The error message is copied from git.c, so it will have the same
output as before if a user runs this in a VFS for Git clone.

Signed-off-by: Derrick Stolee <[email protected]>
When using the sparse-checkout feature git should not write to the working
directory for files with the skip-worktree bit on.  With the skip-worktree
bit on the file may or may not be in the working directory and if it is
not we don't want or need to create it by calling checkout_entry.

There are two callers of checkout_target.  Both of which check that the
file does not exist before calling checkout_target.  load_current which
make a call to lstat right before calling checkout_target and
check_preimage which will only run checkout_taret it stat_ret is less than
zero.  It sets stat_ret to zero and only if !stat->cached will it lstat
the file and set stat_ret to something other than zero.

This patch checks if skip-worktree bit is on in checkout_target and just
returns so that the entry doesn't not end up in the working directory.
This is so that apply will not create a file in the working directory,
then update the index but not keep the working directory up to date with
the changes that happened in the index.

Signed-off-by: Kevin Willford <[email protected]>
Add the ability to block built-in commands based on if the `core.gvfs`
setting has the `GVFS_USE_VIRTUAL_FILESYSTEM` bit set. This allows us
to selectively block commands that use the GVFS protocol, but don't use
VFS for Git (for example repos cloned via `scalar clone` against Azure
DevOps).

Signed-off-by: Matthew John Cheetham <[email protected]>
As of 9e59b38 (object-file: emit corruption errors when detected,
2022-12-14), Git will loudly complain about corrupt objects.

That is fine, as long as the idea isn't to re-download locally-corrupted
objects. But that's exactly what we want to do in VFS for Git via the
`read-object` hook, as per the `GitCorruptObjectTests` code
added in microsoft/VFSForGit@2db0c030eb25 (New
features: [...] -  GVFS can now recover from corrupted git object files
[...] , 2018-02-16).

So let's support precisely that, and add a regression test that ensures
that re-downloading corrupt objects via the `read-object` hook works.

While at it, avoid the XOR operator to flip the bits, when we actually
want to make sure that they are turned off: Use the AND-NOT operator for
that purpose.

Helped-by: Matthew John Cheetham <[email protected]>
Helped-by: Derrick Stolee <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
Loosen the blocking of the `repack` command from all "GVFS repos" (those
that have `core.gvfs` set) to only those that actually use the virtual
file system (VFS for Git only). This allows for `repack` to be used in
Scalar clones.

Signed-off-by: Matthew John Cheetham <[email protected]>
String formatting can be a performance issue when there are
hundreds of thousands of trees.

Change to stop using the strbuf_addf and just add the strings
or characters individually.

There are a limited number of modes so added a switch for the
known ones and a default case if something comes through that
are not a known one for git.

In one scenario regarding a huge worktree, this reduces the
time required for a `git checkout <branch>` from 44 seconds
to 38 seconds, i.e. it is a non-negligible performance
improvement.

Signed-off-by: Kevin Willford <[email protected]>
Loosen the blocking of the `fsck` command from all "GVFS repos" (those
that have `core.gvfs` set) to only those that actually use the virtual
file system (VFS for Git only). This allows for `fsck` to be used in
Scalar clones.

Signed-off-by: Matthew John Cheetham <[email protected]>
The following commands and options are not currently supported when working
in a GVFS repo.  Add code to detect and block these commands from executing.

1) fsck
2) gc
4) prune
5) repack
6) submodule
8) update-index --split-index
9) update-index --index-version (other than 4)
10) update-index --[no-]skip-worktree
11) worktree

Signed-off-by: Ben Peart <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
Loosen the blocking of the `prune` command from all "GVFS repos" (those
that have `core.gvfs` set) to only those that actually use the virtual
file system (VFS for Git only). This allows for `prune` to be used in
Scalar clones.

Signed-off-by: Matthew John Cheetham <[email protected]>
In earlier versions of `microsoft/git`, we found a user who had set
`core.gvfs = false` in their global config. This should not have been
necessary, but it also should not have caused a problem. However, it
did.

The reason was that `gvfs_load_config_value()` was called from
`config.c` when reading config key/value pairs from all the config
files. The local config should override the global config, and this is
done by `config.c` reading the global config first then reading the
local config. However, our logic only allowed writing the `core_gvfs`
variable once.

In v2.51.0, we had to adapt to upstream changes that changed way the
`core.gvfs` config value is read, and the special handling is no longer
necessary, yet we still want the test case that ensures that this bug
does not experience a regression.

Signed-off-by: Derrick Stolee <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
Replace the special casing of the `worktree` command being blocked on
VFS-enabled repos with the new `BLOCK_ON_VFS_ENABLED` flag.

Signed-off-by: Matthew John Cheetham <[email protected]>
Emit a warning message when the `gvfs.sharedCache` option is set that
the `repack` command will not perform repacking on the shared cache.

In the future we can teach `repack` to operate on the shared cache, at
which point we can drop this commit.

Signed-off-by: Matthew John Cheetham <[email protected]>
Teach STATUS to optionally serialize the results of a
status computation to a file.

Teach STATUS to optionally read an existing serialization
file and simply print the results, rather than actually
scanning.

This is intended for immediate status results on extremely
large repos and assumes the use of a service/daemon to
maintain a fresh current status snapshot.

2021-10-30: packet_read() changed its prototype in ec9a37d (pkt-line.[ch]:
remove unused packet_read_line_buf(), 2021-10-14).

2021-10-30: sscanf() now does an extra check that "%d" goes into an "int"
and complains about "uint32_t". Replacing with "%u" fixes the compile-time
error.

2021-10-30: string_list_init() was removed by abf897b (string-list.[ch]:
remove string_list_init() compatibility function, 2021-09-28), so we need to
initialize manually.

Signed-off-by: Jeff Hostetler <[email protected]>
Signed-off-by: Derrick Stolee <[email protected]>
Teach status serialization to take an optional pathname on
the command line to direct that cache data be written there
rather than to stdout.  When used this way, normal status
results will still be written to stdout.

When no path is given, only binary serialization data is
written to stdout.

Usage:
    git status --serialize[=<path>]

Signed-off-by: Jeff Hostetler <[email protected]>
Teach status deserialize code to reject status cache
when printing in porcelain V2 and there are unresolved
conflicts in the cache file.  A follow-on task might
extend the cache format to include this additiona data.

See code for longer explanation.

Signed-off-by: Jeff Hostetler <[email protected]>
On index load, clear/set the skip worktree bits based on the virtual
file system data. Use virtual file system data to update skip-worktree
bit in unpack-trees. Use virtual file system data to exclude files and
folders not explicitly requested.

Update 2022-04-05: disable the "present-despite-SKIP_WORKTREE" file removal
behavior when 'core.virtualfilesystem' is enabled.

Signed-off-by: Ben Peart <[email protected]>
dscho and others added 16 commits November 17, 2025 19:13
In some instances, CodeQL's web UI on github.com leaves questions
unanswered. For example, in some alerts it is really necessary to follow
the entire "taint flow" to understand why something might be an issue.

The alerts for the `cpp/uncontrolled-allocation-size` rule, for example,
are all false positives, and only when inspecting the exact flow does it
become obvious that one alert wants to point out that the size of a
binary patch hunk, which is specified in the patch, is then used to
determine how much memory to allocate, which may potentially run out of
memory (and is hence just Git doing what it is asked to, and does not
need to be changed).

To help with those issues, publish the `.sarif` file as part of every
workflow run; This allows downloading that file and inspecting it e.g.
with the SARIF viewer extension in VS Code (for details, see
https://marketplace.visualstudio.com/items?itemName=MS-SarifVSCode.sarif-viewer).

Signed-off-by: Johannes Schindelin <[email protected]>
CodeQL points out that `branch_get()` can return NULL values.

Signed-off-by: Johannes Schindelin <[email protected]>
The code is a bit too hard to reason about for CodeQL to figure out
whether the `fill_commit_graph_info()`  function is at all called after
`write_commit_graph()` returns (and hence whether `topo_levels` goes out
of context before it is used again).

The Git project insists that this is correct (and does not want to make
the code more obviously correct), so let's silence CodeQL's complaints
in this instance.

Signed-off-by: Johannes Schindelin <[email protected]>
A couple of CodeQL's queries are opinionated in a way that is obviously
not shared by Git's source code's state, and apparently intentionally so.

For example, the "For loop variable changed in body" query as well as
the "No trivial switch statements" one result in too many results that
are apparently intentional in Git's source code. Let's not worry about
those, then. Also, Git has plenty of instances where variables shadow
other variables.

Other valid yet not quite critical issues identified by CodeQL include
complex conditionals and nested switch statements spanning several
pages.

We probably want to address these issues at some stage, but they are not
as critical as other problems pointed out by CodeQL, so let's silence
those queries for now and take care of them at a later stage.

Signed-off-by: Johannes Schindelin <[email protected]>
A few places where CodeQL thinks that variables might be uninitialized.

Signed-off-by: Johannes Schindelin <[email protected]>
…oes NUL-terminate correctly

Signed-off-by: Johannes Schindelin <[email protected]>
These patches implement some defensive programming to address complaints
some static analyzers might have.

Signed-off-by: Johannes Schindelin <[email protected]>
Let's exclude GitWeb from being scanned; It is not distributed by us.

Signed-off-by: Johannes Schindelin <[email protected]>
CodeQL pointed out a couple of issues, which are addressed in this patch
series.

Signed-off-by: Johannes Schindelin <[email protected]>
This patch series has been long in the making, ever since Johannes
Nicolai and myself spiked this in November/December 2020.

Signed-off-by: Johannes Schindelin <[email protected]>
The microsoft/git fork includes pre- and post-command hooks, with the
initial intention of using these for VFS for Git. In that environment,
these are important hooks to avoid concurrent issues when the
virtualization is incomplete.

However, in the Office monorepo the post-command hook is used in a
different way. A custom hook is used to update the sparse-checkout, if
necessary. To avoid this hook from being incredibly slow on every Git
command, this hook checks for the existence of a "sentinel file" that is
written by a custom post-index-change hook and no-ops if that file does
not exist.

However, even this "no-op" is 200ms due to the use of two scripts (one
simple script in .git/hooks/ does some environment checking and then
calls a script from the working directory which actually contains the
logic).

Add a new config option, 'postCommand.strategy', that will allow for
multiple possible strategies in the future. For now, the one we are
adding is 'post-index-change' which states that we should write a
sentinel file instead of running the 'post-index-change' hook and then
skip the 'post-command' hook if the proper sentinel file doesn't exist.
(If it does exist, then delete it and run the hook.)

--- 

This fork contains changes specific to monorepo scenarios. If you are an
external contributor, then please detail your reason for submitting to
this fork:

* [ ] This is an early version of work already under review upstream.
* [ ] This change only applies to interactions with Azure DevOps and the
      GVFS Protocol.
* [ ] This change only applies to the virtualization hook and VFS for
Git.
* [x] This change only applies to custom bits in the microsoft/git fork.
This patch series has been long in the making, ever since Johannes
Nicolai and myself spiked this in November/December 2020.

Signed-off-by: Johannes Schindelin <[email protected]>
@dscho dscho self-assigned this Nov 17, 2025
@dscho
Copy link
Member Author

dscho commented Nov 17, 2025

Range-diff relative to v2.52.0-rc2
  • 3: 27a2e9e = 1: 59e95ca survey: calculate more stats on refs

  • 4: bc4c274 = 2: 9d5f9e4 survey: show some commits/trees/blobs histograms

  • 5: 270a81b = 3: 4c586cb survey: add vector of largest objects for various scaling dimensions

  • 6: b9df9d5 = 4: f35b3e7 survey: add pathname of blob or tree to large_item_vec

  • 7: ed1a1af = 5: 7d41254 survey: add commit-oid to large_item detail

  • 8: f92d698 = 6: 338d9da survey: add commit name-rev lookup to each large_item

  • 9: 8df06ee = 7: e8a6751 survey: add --no-name-rev option

  • 1: 5ae26e7 = 8: 1ffd4c8 sparse-index.c: fix use of index hashes in expand_index

  • 10: 91c6082 = 9: 81d5530 survey: started TODO list at bottom of source file

  • 11: ca18509 = 10: a2cc235 t5300: confirm failure of git index-pack when non-idx suffix requested

  • 2: 8c8d2ae = 11: 92fdb68 t: remove advice from some tests

  • 12: d4bf58d = 12: 4ae9cbd t1092: add test for untracked files and directories

  • 13: bfabaf9 = 13: 43f0d81 survey: expanded TODO list at the bottom of the source file

  • 14: 8643e6d = 14: d930723 index-pack: disable rev-index if index file has non .idx suffix

  • 16: 3149277 = 15: 9c89875 trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup

  • 15: 9159f4b = 16: bee35c4 survey: expanded TODO with more notes

  • 17: ad406a8 = 17: 9039ffe reset --stdin: trim carriage return from the paths

  • 18: 5f0eec0 ! 18: 8eab8ac Identify microsoft/git via a distinct version suffix

    @@ Commit message
      ## GIT-VERSION-GEN ##
     @@
      
    - DEF_VER=v2.52.0-rc2
    + DEF_VER=v2.52.0
      
     +# Identify microsoft/git via a distinct version suffix
     +DEF_VER=$DEF_VER.vfs.0.0
  • 19: 7052c1c = 19: c74ee39 gvfs: ensure that the version is based on a GVFS tag

  • 20: eed9ced = 20: 33a392a gvfs: add a GVFS-specific header file

  • 21: a00b367 = 21: 500d070 gvfs: add the core.gvfs config setting

  • 22: 794dccd = 22: ff1fe6d gvfs: add the feature to skip writing the index' SHA-1

  • 23: 52a01fa = 23: adb520c gvfs: add the feature that blobs may be missing

  • 24: 2db15f6 = 24: d673ccf gvfs: prevent files to be deleted outside the sparse checkout

  • 25: 96d1c6e = 25: 2ffe857 gvfs: optionally skip reachability checks/upload pack during fetch

  • 26: 659314f = 26: 90b7929 gvfs: ensure all filters and EOL conversions are blocked

  • 27: 120ec0c = 27: dace480 gvfs: allow "virtualizing" objects

  • 28: b5af221 = 28: f5da48f Hydrate missing loose objects in check_and_freshen()

  • 29: 2afbaf1 = 29: 1eb8c1b sha1_file: when writing objects, skip the read_object_hook

  • 30: ed6ffb0 = 30: c852173 gvfs: add global command pre and post hook procs

  • 31: f89aa57 = 31: f9c2455 t0400: verify that the hook is called correctly from a subdirectory

  • 32: 734864b = 32: a873609 t0400: verify core.hooksPath is respected by pre-command

  • 33: a4fe4ee = 33: f393e0b Pass PID of git process to hooks.

  • 34: fc5bed6 = 34: 23b48a2 sparse-checkout: make sure to update files with a modify/delete conflict

  • 35: c04ba52 = 35: 6cc5cdd worktree: allow in Scalar repositories

  • 36: 3416031 = 36: e03e55f sparse-checkout: avoid writing entries with the skip-worktree bit

  • 37: 3efb71c = 37: d6b899a Do not remove files outside the sparse-checkout

  • 38: 07bc8ad = 38: 2599d83 send-pack: do not check for sha1 file when GVFS_MISSING_OK set

  • 39: 95055e3 = 39: d3a9c83 gvfs: allow corrupt objects to be re-downloaded

  • 40: 2a900a0 = 40: 71445fe cache-tree: remove use of strbuf_addf in update_one

  • 41: cb1e109 = 41: fd65a3a gvfs: block unsupported commands when running in a GVFS repo

  • 42: a429b82 = 42: d926c79 gvfs: allow overriding core.gvfs

  • 43: abfd4d5 = 43: ac21b75 BRANCHES.md: Add explanation of branches and using forks

  • 54: bd40c18 = 44: 64cbd4e git.c: add VFS enabled cmd blocking

  • 56: 4dd2d43 = 45: ed93bfd git.c: permit repack cmd in Scalar repos

  • 58: 973a7b4 = 46: 83a9855 git.c: permit fsck cmd in Scalar repos

  • 60: 7380faf = 47: 109925d git.c: permit prune cmd in Scalar repos

  • 62: 29fb4aa = 48: 82f3cf2 worktree: remove special case GVFS cmd blocking

  • 64: 8d1d6a8 = 49: 4e55278 builtin/repack.c: emit warning when shared cache is present

  • 44: 1987af3 = 50: eebb8e2 Add virtual file system settings and hook proc

  • 45: fcfa01d = 51: cba0dcb virtualfilesystem: don't run the virtual file system hook if the index has been redirected

  • 46: cfb56ea = 52: b97a594 virtualfilesystem: check if directory is included

  • 47: 9b47f9e = 53: c63215d backwards-compatibility: support the post-indexchanged hook

  • 48: c2199ec = 54: df8fddc gvfs: verify that the built-in FSMonitor is disabled

  • 49: ea2ea35 = 55: 0afb94e wt-status: add trace2 data for sparse-checkout percentage

  • 50: adeb717 = 56: 6f4ff2d status: add status serialization mechanism

  • 51: 0afeb46 = 57: c30ac09 Teach ahead-behind and serialized status to play nicely together

  • 52: 59be78a = 58: 559ff2b status: serialize to path

  • 53: 51d2bf5 = 59: f768ecf status: reject deserialize in V2 and conflicts

  • 55: db1a90f = 60: 781af8f serialize-status: serialize global and repo-local exclude file metadata

  • 57: f967fe4 = 61: 0966f1d status: deserialization wait

  • 59: 19d5564 = 62: 6dc05f1 status: deserialize with -uno does not print correct hint

  • 61: bc90d1d = 63: 08ae962 fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 63: d03192d = 64: e4668c7 fsmonitor: add script for debugging and update script for tests

  • 65: a04f3bd = 65: 2df56fa status: disable deserialize when verbose output requested.

  • 66: 2589c8c = 66: 72e22f9 t7524: add test for verbose status deserialzation

  • 67: 12140ac = 67: 4185ec0 deserialize-status: silently fallback if we cannot read cache file

  • 68: 0ad6652 = 68: ed646e5 gvfs:trace2:data: add trace2 tracing around read_object_process

  • 69: b622926 = 69: 9eae94a gvfs:trace2:data: status deserialization information

  • 70: 70ad974 = 70: 0aeef5f gvfs:trace2:data: status serialization

  • 71: 4d86ece = 71: 7c4d0e2 gvfs:trace2:data: add vfs stats

  • 72: 3529637 = 72: 8f1130a trace2: refactor setting process starting time

  • 73: 4c9c375 = 73: 9138bf5 trace2:gvfs:experiment: clear_ce_flags_1

  • 74: d687711 = 74: c4db737 trace2:gvfs:experiment: report_tracking

  • 75: 4561416 = 75: 58a06e1 trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 76: 3cc67c0 = 76: ca92d61 trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

  • 77: 320d7b0 = 77: f905905 trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 78: 2d5cd9d = 78: 16bf262 trace2:gvfs:experiment: add region around unpack_trees()

  • 79: cde80f6 = 79: 70ad1b0 trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 80: e773af8 = 80: 0a6d3b1 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

  • 81: 813a95d = 81: f0bd9c1 trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 82: f61f8f5 = 82: b65ac9b trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 83: e1318a4 = 83: cb7f57d Trace2:gvfs:experiment: capture more 'tracking' details

  • 84: 26b38bd = 84: d33770d credential: set trace2_child_class for credential manager children

  • 85: dcce122 = 85: 4d965ad sub-process: do not borrow cmd pointer from caller

  • 86: 6c21ed8 = 86: b5cdcff sub-process: add subprocess_start_argv()

  • 87: bed621d = 87: be563b7 sha1-file: add function to update existing loose object cache

  • 88: cca9453 = 88: 4e743e6 packfile: add install_packed_git_and_mru()

  • 89: 7249d96 = 89: 53e0ae4 index-pack: avoid immediate object fetch while parsing packfile

  • 90: c798253 = 90: b46ad0a gvfs-helper: create tool to fetch objects using the GVFS Protocol

  • 91: e49bd7c = 91: 763e9b9 sha1-file: create shared-cache directory if it doesn't exist

  • 92: 768c2b2 = 92: 614c85e gvfs-helper: better handling of network errors

  • 93: d6d395d = 93: e672c0e gvfs-helper-client: properly update loose cache with fetched OID

  • 94: 16d4a70 = 94: 6ea75c5 gvfs-helper: V2 robust retry and throttling

  • 95: 1c62e7d = 95: 3ce279b gvfs-helper: expose gvfs/objects GET and POST semantics

  • 96: 6c02f7a = 96: 77504cf gvfs-helper: dramatically reduce progress noise

  • 97: 5f2a903 = 97: 8340ab7 gvfs-helper: handle pack-file after single POST request

  • 98: aa4d01d = 98: de4f7af test-gvfs-prococol, t5799: tests for gvfs-helper

  • 99: d07dfd7 = 99: b71d6ae gvfs-helper: move result-list construction into install functions

  • 100: 25eeca5 = 100: 1d727d5 t5799: add support for POST to return either a loose object or packfile

  • 101: fad61e9 = 101: a97f685 t5799: cleanup wc-l and grep-c lines

  • 102: 106e1d0 = 102: 16c08a7 gvfs-helper: verify loose objects after write

  • 103: 6ebbe1f = 103: e4b9b44 t7599: create corrupt blob test

  • 104: 33f9d6a = 104: b8f8754 gvfs-helper: add prefetch support

  • 105: 5416def = 105: 66c53ad gvfs-helper: add prefetch .keep file for last packfile

  • 106: 1e16f8b = 106: 7fa304e gvfs-helper: do one read in my_copy_fd_len_tail()

  • 107: b2faaba = 107: 4a51839 gvfs-helper: move content-type warning for prefetch packs

  • 108: 27ed7a0 = 108: d5d13e4 fetch: use gvfs-helper prefetch under config

  • 109: 6e5d919 = 109: 3737e02 gvfs-helper: better support for concurrent packfile fetches

  • 110: 4cb5ef5 = 110: 0df839f remote-curl: do not call fetch-pack when using gvfs-helper

  • 111: f076b43 = 111: 7c0292f fetch: reprepare packs before checking connectivity

  • 112: 55eadb4 = 112: 61faefe gvfs-helper: retry when creating temp files

  • 113: 5a99938 = 113: 3ba1db1 sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 114: ae90f35 = 114: b4d5fee gvfs-helper: add --max-retries to prefetch verb

  • 115: b9b2245 = 115: 58484f0 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 116: 773e324 = 116: d0c6df2 gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 117: 28a7b82 = 117: f48c9c9 t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 118: d0cf13c = 118: afe38f4 gvfs-helper: don't fallback with new config

  • 120: a1bd9a9 = 119: e8eff45 maintenance: care about gvfs.sharedCache config

  • 122: 99cba4f = 120: 8e94c5e unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 123: 68aff57 = 121: 56471ce homebrew: add GitHub workflow to release Cask

  • 124: 8d8cba9 = 122: 0f989a2 Adding winget workflows

  • 125: 9073d35 = 123: 3e5ab76 Disable the monitor-components workflow in msft-git

  • 126: a21e4ca = 124: cfeb5b4 .github: enable windows builds on microsoft fork

  • 128: 5c1c031 = 125: b5b8beb .github/actions/akv-secret: add action to get secrets

  • 130: 311fca8 = 126: 52ac0d1 release: create initial Windows installer build workflow

  • 132: 170fb50 = 127: 6efdee7 release: create initial Windows installer build workflow

  • 135: 3ff8843 = 128: f14ea8a help: special-case HOST_CPU universal

  • 138: 9bd204b = 129: f25ca1e release: add Mac OSX installer build

  • 141: b639c38 = 130: 7c62bfa release: build unsigned Ubuntu .deb package

  • 210: 37a8516 = 131: 2675196 release: add signing step for .deb package

  • 119: 4a88d79 = 132: a957878 test-gvfs-protocol: add cache_http_503 to mayhem

  • 211: 2ba5c69 = 133: 44958f7 release: create draft GitHub release with packages & installers

  • 121: 6054c97 = 134: dbbfb0d t5799: add unit tests for new gvfs.fallback config setting

  • 127: 82bde85 = 135: 4562f38 update-microsoft-git: create barebones builtin

  • 129: 9ff718b = 136: 3f77287 update-microsoft-git: Windows implementation

  • 212: 07b6336 = 137: 81d1da4 build-git-installers: publish gpg public key

  • 131: 3a5e967 = 138: 6a1129a update-microsoft-git: use brew on macOS

  • 213: 9bf66ca = 139: 1552b43 release: continue pestering until user upgrades

  • 134: fd2ae34 = 140: 9cf6c98 .github: reinstate ISSUE_TEMPLATE.md for microsoft/git

  • 214: bc79791 = 141: 3505413 dist: archive HEAD instead of HEAD^{tree}

  • 133: 5c2a109 = 142: a4e5a11 git_config_set_multivar_in_file_gently(): add a lock timeout

  • 137: 82edad1 = 143: b87c26a .github: update PULL_REQUEST_TEMPLATE.md

  • 215: 79ac819 = 144: f589ada release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 136: b1db490 = 145: b3ebac2 scalar: set the config write-lock timeout to 150ms

  • 140: e179945 = 146: 70329c1 Adjust README.md for microsoft/git

  • 216: 7f70c59 = 147: 45c713e release: add installer validation

  • 139: 14e7aef = 148: ed317ca scalar: add docs from microsoft/scalar

  • 142: 9bf6b42 = 149: 31963eb scalar (Windows): use forward slashes as directory separators

  • 143: 5086343 = 150: d274abe scalar: add retry logic to run_git()

  • 144: ae304f7 = 151: de53ca4 scalar: support the config command for backwards compatibility

  • 145: 9607cbe = 152: 9871237 scalar: implement a minimal JSON parser

  • 146: eaf5610 = 153: 8bfb239 scalar clone: support GVFS-enabled remote repositories

  • 147: 6748eda = 154: 03cabd8 test-gvfs-protocol: also serve smart protocol

  • 148: 5e79169 = 155: e9eee40 gvfs-helper: add the endpoint command

  • 149: a77ac05 = 156: a944e34 dir_inside_of(): handle directory separators correctly

  • 150: 7ff77a5 = 157: eef1989 scalar: disable authentication in unattended mode

  • 151: 4f7ba9a = 158: a5f7a70 abspath: make strip_last_path_component() global

  • 152: 3a7c099 = 159: 35e9646 scalar: do initialize gvfs.sharedCache

  • 153: b059d08 = 160: 7bbc473 scalar diagnose: include shared cache info

  • 154: 127a90c = 161: 9afae7e scalar: only try GVFS protocol on https:// URLs

  • 155: d2e167c = 162: eecc2fe scalar: verify that we can use a GVFS-enabled repository

  • 156: 4c137d7 = 163: aa93378 scalar: add the cache-server command

  • 157: 71de5c3 = 164: c4fd085 scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 158: ed4b494 = 165: 6834689 scalar: adjust documentation to the microsoft/git fork

  • 159: 3f6488a = 166: 339f964 scalar: enable untracked cache unconditionally

  • 160: c85f567 = 167: 0b8b3b1 scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 162: 04046d3 = 168: 4ab8a41 scalar: make GVFS Protocol a forced choice

  • 164: f8c7d1a = 169: d684bf1 scalar: work around GVFS Protocol HTTP/2 failures

  • 166: 0eb4b03 = 170: 4f35628 gvfs-helper-client: clean up server process(es)

  • 169: 47800be = 171: d87b397 scalar diagnose: accommodate Scalar's Functional Tests

  • 161: 8245a33 = 172: 5f5c2e1 add/rm: allow adding sparse entries when virtual

  • 163: 893b95d = 173: 08c6f16 sparse-checkout: add config to disable deleting dirs

  • 217: c951982 = 174: c678112 ci: run Scalar's Functional Tests

  • 165: 18349ac = 175: b92840f diff: ignore sparse paths in diffstat

  • 218: bf3ee41 = 176: 6a04a00 scalar: upgrade to newest FSMonitor config setting

  • 167: 35c854f = 177: 0fbcabc repo-settings: enable sparse index by default

  • 168: ee56ee2 = 178: 4b24114 TO-UPSTREAM: sequencer: avoid progress when stderr is redirected

  • 170: 92be18b = 179: c9520df TO-CHECK: t1092: use quiet mode for rebase tests

  • 171: 6d08e4d = 180: 33d632a reset: fix mixed reset when using virtual filesystem

  • 172: d289267 = 181: b1ccdad diff(sparse-index): verify with partially-sparse

  • 173: eb261d9 = 182: 276ff94 stash: expand testing for git stash -u

  • 174: cb179c6 = 183: 21e6e77 sparse-index: add ensure_full_index_with_reason()

  • 175: f4e2d5b = 184: 44554ac treewide: add reasons for expanding index

  • 176: 5a2a278 = 185: 5f15774 treewide: custom reasons for expanding index

  • 177: 90f7e00 = 186: 8abb5bb sparse-index: add macro for unaudited expansions

  • 178: c6076bc = 187: a3b970b Docs: update sparse index plan with logging

  • 179: ee48f41 = 188: d14448e sparse-index: log failure to clear skip-worktree

  • 180: 97b7cc1 = 189: 3787fdf stash: use -f in checkout-index child process

  • 181: ce36524 = 190: e7ab470 sparse-index: do not copy hashtables during expansion

  • 219: 427f765 = 191: 0779173 TO-UPSTREAM: sub-process: avoid leaking cmd

  • 220: af64abf = 192: a935153 remote-curl: release filter options before re-setting them

  • 221: 6ab2b04 = 193: f2cc70c transport: release object filter options

  • 222: 0ee055b = 194: 0cffb2b push: don't reuse deltas with path walk

  • 223: 8b95fdc = 195: e789961 t7900-maintenance.sh: reset config between tests

  • 224: d4cbdc3 = 196: 58f2ac1 maintenance: add cache-local-objects maintenance task

  • 225: bcc01b2 = 197: e05caee scalar.c: add cache-local-objects task

  • 226: bac6361 = 198: 0449ce4 hooks: add custom post-command hook config

  • 227: f5f4d8d = 199: be736e3 TO-UPSTREAM: Docs: fix asciidoc failures from short delimiters

  • 228: c4f2d0f = 200: 08ee1dd hooks: make hook logic memory-leak free

  • 182: 3175d9c = 201: 4124f85 cat_one_file(): make it easy to see that the size variable is initialized

  • 184: 50d20c7 = 202: 445a948 fsck: avoid using an uninitialized variable

  • 186: 49977f0 = 203: 03bba98 load_revindex_from_disk(): avoid accessing uninitialized data

  • 229: a470a13 = 204: 1cd37c0 t0401: test post-command for alias, version, typo

  • 188: 52bc7ca = 205: 55f5d1a load_pack_mtimes_file(): avoid accessing uninitialized data

  • 230: 94b3990 = 206: 9cb759f hooks: better handle config without gitdir

  • 183: 894483a = 207: 5012092 revision: defensive programming

  • 185: 555b775 = 208: c04c3f4 get_parent(): defensive programming

  • 187: 19d9cbd = 209: 3982ec6 fetch-pack: defensive programming

  • 190: 0cff22f = 210: d5bd6e9 unparse_commit(): defensive programming

  • 192: dad6684 = 211: aa5d7db verify_commit_graph(): defensive programming

  • 194: 09d11be = 212: 75bc9c4 stash: defensive programming

  • 196: 5d99281 = 213: 3d81d04 fetch: silence a CodeQL alert about a local variable's address' use after release

  • 197: 5c6d8c7 = 214: 621340b stash: defensive programming

  • 199: 0152e76 = 215: 629d433 submodule: check return value of submodule_from_path()

  • 200: b7cf1c6 = 216: bb6ed4b push: defensive programming

  • 202: b7f15d3 = 217: f207589 test-tool repository: check return value of lookup_commit()

  • 189: f244456 = 218: 94c76f9 codeql: run static analysis as part of CI builds

  • 203: ad86369 = 219: 52ac586 fetch: defensive programming

  • 205: 0f6ce61 = 220: 9afcb88 shallow: handle missing shallow commits gracefully

  • 191: 77b5963 = 221: 5cf407a codeql: publish the sarif file as build artifact

  • 206: e7ce483 = 222: 473b681 inherit_tracking(): defensive programming

  • 208: 91fdbd8 = 223: 7b976ae commit-graph: suppress warning about using a stale stack addresses

  • 193: 8d8a4b4 = 224: 9e41ca1 codeql: disable a couple of non-critical queries for now

  • 195: 56bd75f = 225: aad1990 date: help CodeQL understand that there are no leap-year issues here

  • 198: 2925fd2 = 226: 6771403 help: help CodeQL understand that consuming envvars is okay here

  • 201: 19996a2 = 227: 1328dc4 ctype: help CodeQL understand that sane_istest() does not access array past end

  • 204: 448a38c = 228: 09ebb2c ctype: accommodate for CodeQL misinterpreting the z in mallocz()

  • 207: 220b92c = 229: f731d22 strbuf_read: help with CodeQL misunderstanding that strbuf_read() does NUL-terminate correctly

  • 209: d0d0f34 = 230: f54bb27 codeql: also check JavaScript code

@dscho dscho merged commit df57b45 into vfs-2.52.0 Nov 17, 2025
274 of 276 checks passed
@dscho dscho deleted the tentative/vfs-2.52.0 branch November 17, 2025 21:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.