Skip to content

Conversation

@dscho
Copy link
Member

@dscho dscho commented Oct 17, 2025

This represents a cleaned up version of vfs-2.51.0 (which is tree-same), rebased onto Git for Windows v2.51.1.

Kevin Willford and others added 30 commits October 17, 2025 18:01
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
…x has been redirected

Fixes #13

Some git commands spawn helpers and redirect the index to a different
location.  These include "difftool -d" and the sequencer
(i.e. `git rebase -i`, `git cherry-pick` and `git revert`) and others.
In those instances we don't want to update their temporary index with
our virtualization data.

Helped-by: Johannes Schindelin <[email protected]>
Signed-off-by: Ben Peart <[email protected]>
Add check to see if a directory is included in the virtualfilesystem
before checking the directory hashmap.  This allows a directory entry
like foo/ to find all untracked files in subdirectories.
When our patches to support that hook were upstreamed, the hook's name
was eliciting some reviewer suggestions, and it was renamed to
`post-index-change`. These patches (with the new name) made it into
v2.22.0.

However, VFSforGit users may very well have checkouts with that hook
installed under the original name.

To support this, let's just introduce a hack where we look a bit more
closely when we just failed to find the `post-index-change` hook, and
allow any `post-indexchanged` hook to run instead (if it exists).
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]>
When using a virtual file system layer, the FSMonitor does not make
sense.

Signed-off-by: Johannes Schindelin <[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]>
When sparse-checkout is enabled, add the sparse-checkout percentage to
the Trace2 data stream.  This number was already computed and printed
on the console in the "You are in a sparse checkout..." message.  It
would be helpful to log it too for performance monitoring.

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]>
Changes to the global or repo-local excludes files can change the
results returned by "git status" for untracked files.  Therefore,
it is important that the exclude-file values used during serialization
are still current at the time of deserialization.

Teach "git status --serialize" to report metadata on the user's global
exclude file (which defaults to "$XDG_HOME/git/ignore") and for the
repo-local excludes file (which is in ".git/info/excludes").  Serialize
will record the pathnames and mtimes for these files in the serialization
header (next to the mtime data for the .git/index file).

Teach "git status --deserialize" to validate this new metadata.  If either
exclude file has changed since the serialization-cache-file was written,
then deserialize will reject the cache file and force a full/normal status
run.

Signed-off-by: Jeff Hostetler <[email protected]>
Teach `git status --deserialize` to either wait indefintely
or immediately fail if the status serialization cache file
is stale.

Signed-off-by: Jeff Hostetler <[email protected]>
With the "--untracked-files=complete" option status computes a
superset of the untracked files.  We use this when writing the
status cache.  If subsequent deserialize commands ask for either
the complete set or one of the "no", "normal", or "all" subsets,
it can still use the cache file because of filtering in the
deserialize parser.

When running status with the "-uno" option, the long format
status would print a "(use -u to show untracked files)" hint.

When deserializing with the "-uno" option and using a cache computed
with "-ucomplete", the "nothing to commit, working tree clean" message
would be printed instead of the hint.

It was easy to miss because the correct hint message was printed
if the cache was rejected for any reason (and status did the full
fallback).

The "struct wt_status des" structure was initialized with the
content of the status cache (and thus defaulted to "complete").
This change sets "des.show_untracked_files" to the requested
subset from the command-line or config.  This allows the long
format to print the hint.

Signed-off-by: Jeff Hostetler <[email protected]>
When using fsmonitor the CE_FSMONITOR_VALID flag should be checked when
wanting to know if the entry has been updated. If the flag is set the
entry should be considered up to date and the same as if the CE_UPTODATE
is set.

In order to trust the CE_FSMONITOR_VALID flag, the fsmonitor data needs to
be refreshed when the fsmonitor bitmap is applied to the index in
tweak_fsmonitor. Since the fsmonitor data is kept up to date for every
command, some tests needed to be updated to take that into account.

istate->untracked->use_fsmonitor was set in tweak_fsmonitor when the
fsmonitor bitmap data was loaded and is now in refresh_fsmonitor since
that is being called in tweak_fsmonitor. refresh_fsmonitor will only be
called once and any other callers should be setting it when refreshing
the fsmonitor data so that code can use the fsmonitor data when checking
untracked files.

When writing the index, fsmonitor_last_update is used to determine if
the fsmonitor bitmap should be created and the extension data written to
the index. When running through unpack-trees this is not copied to the
result index. This makes the next time a git command is ran do all the
work of lstating all files to determine what is clean since all entries
in the index are marked as dirty since there wasn't any fsmonitor data
saved in the index extension.

Copying the fsmonitor_last_update to the result index will cause the
extension data for fsmonitor to be in the index for the next git command
to use.

Signed-off-by: Kevin Willford <[email protected]>
The fsmonitor script that can be used for running all the git tests
using watchman was causing some of the tests to fail because it wrote
to stderr and created some files for debugging purposes.

Add a new debug script to use with debugging and modify the other script
to remove the code that would cause tests to fail.

Signed-off-by: Kevin Willford <[email protected]>
Disable deserialization when verbose output requested.

Verbose mode causes Git to print diffs for modified files.
This requires the index to be loaded to have the currently
staged OID values.  Without loading the index, verbose output
make it look like everything was deleted.

Signed-off-by: Jeff Hostetler <[email protected]>
derrickstolee and others added 11 commits October 17, 2025 18:26
Add the `cache-local-objects` maintenance task to the list of tasks run
by the `scalar run` command. It's often easier for users to run the
shorter `scalar run` command than the equivalent `git maintenance`
command.

Signed-off-by: Matthew John Cheetham <[email protected]>
This helps t0401 pass while under SANITIZE=leak.

Signed-off-by: Derrick Stolee <[email protected]>
Introduce a new maintenance task, `cache-local-objects`, that operates
on Scalar or VFS for Git repositories with a per-volume, shared object
cache (specified by `gvfs.sharedCache`) to migrate packfiles and loose
objects from the repository object directory to the shared cache.

Older versions of `microsoft/git` incorrectly placed packfiles in the
repository object directory instead of the shared cache; this task will
help clean up existing clones impacted by that issue.

Fixes #716
TODO: drop this, it is a left-over from a patch that was upstreamed as
98f8854 (index-pack: allow revisiting REF_DELTA chains,
2025-04-28).

This new test demonstrates some behavior where a valid packfile is being
rejected by the Git client due to the order in which it is resolving
REF_DELTAs.

The thin packfile has a REF_DELTA chain A->B->C where C is not included
in the packfile. However, the client repository contains both C and B
already. Thus, 'git index-pack' is able to resolve A before resolving B.

When resolving B, it then attempts to resolve any other REF_DELTAs that
are pointing to B as a base. This "revisits" A and complains as if there
is a cycle, but it did not actually detect a cycle.

A fix will arrive in the next change.

Signed-off-by: Derrick Stolee <[email protected]>
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 is an early version of work already under review upstream:
gitgitgadget#1906
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]>
This is no longer needed.

Signed-off-by: Johannes Schindelin <[email protected]>
…rimental'

This is no longer needed.

Signed-off-by: Johannes Schindelin <[email protected]>
…lear more files'

This is no longer needed.

Signed-off-by: Johannes Schindelin <[email protected]>
@dscho dscho force-pushed the tentative/vfs-2.51.1 branch from 1f863fd to cdb99b8 Compare October 17, 2025 16:26
@dscho
Copy link
Member Author

dscho commented Oct 17, 2025

Range-diff relative to clean/vfs-2.51.0
  • 6: 595fa63 = 1: 12dfbf9 sparse-index.c: fix use of index hashes in expand_index

  • 7: 8a92a1d = 2: bb322c7 t5300: confirm failure of git index-pack when non-idx suffix requested

  • 1: ac19259 = 3: d3b9f9a t: remove advice from some tests

  • 9: 651227e = 4: 6b4bf80 t1092: add test for untracked files and directories

  • 10: a407def = 5: 1a604fc index-pack: disable rev-index if index file has non .idx suffix

  • 2: 9ea1c12 = 6: 1484c6c survey: calculate more stats on refs

  • 3: 8ca5ed5 ! 7: c1f8560 survey: show some commits/trees/blobs histograms

    @@ builtin/survey.c: static void increment_totals(struct survey_context *ctx,
      		oi.typep = &type;
      		oi.sizep = &object_length;
     @@ builtin/survey.c: static void increment_totals(struct survey_context *ctx,
    - 		if (oid_object_info_extended(ctx->repo, &oids->oid[i],
    - 					     &oi, oi_flags) < 0) {
    + 						  &oids->oid[i],
    + 						  &oi, oi_flags) < 0) {
      			summary->num_missing++;
     -		} else {
     -			summary->nr++;
  • 4: 0f7b4d0 = 8: c9f1a26 survey: add vector of largest objects for various scaling dimensions

  • 5: 8151bcb = 9: 1731a38 survey: add pathname of blob or tree to large_item_vec

  • 11: 9edb94d = 10: 9b23b30 trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup

  • 8: 379642d = 11: eead915 survey: add commit-oid to large_item detail

  • 12: e85aa09 = 12: 283f844 survey: add commit name-rev lookup to each large_item

  • 13: 4be7740 = 13: ad06724 survey: add --no-name-rev option

  • 14: 261180d = 14: f1b608c survey: started TODO list at bottom of source file

  • 15: bac0309 = 15: 10e1b5d survey: expanded TODO list at the bottom of the source file

  • 16: 9a93d25 = 16: c225c01 survey: expanded TODO with more notes

  • 17: 1ca5d62 = 17: c9c09d1 reset --stdin: trim carriage return from the paths

  • 18: 0e08e49 ! 18: 030da49 Identify microsoft/git via a distinct version suffix

    @@ Commit message
      ## GIT-VERSION-GEN ##
     @@
      
    - DEF_VER=v2.51.0
    + DEF_VER=v2.51.1
      
     +# Identify microsoft/git via a distinct version suffix
     +DEF_VER=$DEF_VER.vfs.0.0
  • 19: 243d044 = 19: 2914941 gvfs: ensure that the version is based on a GVFS tag

  • 20: 015ae6a = 20: ac5f6d6 gvfs: add a GVFS-specific header file

  • 21: 250d3a9 = 21: c9dac08 gvfs: add the core.gvfs config setting

  • 22: e081e44 = 22: 4a1a067 gvfs: add the feature to skip writing the index' SHA-1

  • 23: b662f64 = 23: 05a5aab gvfs: add the feature that blobs may be missing

  • 24: 70466b0 = 24: c342e0b gvfs: prevent files to be deleted outside the sparse checkout

  • 25: 2a30ff0 = 25: 4dd4444 gvfs: optionally skip reachability checks/upload pack during fetch

  • 26: 72fcb66 = 26: 8fada6e gvfs: ensure all filters and EOL conversions are blocked

  • 27: 7df6aca = 27: cb42bd5 gvfs: allow "virtualizing" objects

  • 28: d247a49 ! 28: 73fb8af Hydrate missing loose objects in check_and_freshen()

    @@ odb.h: static inline int odb_write_object(struct object_database *odb,
      
     +int read_object_process(struct repository *r, const struct object_id *oid);
     +
    - /* Compatibility wrappers, to be removed once Git 2.51 has been released. */
    - #include "repository.h"
    - 
    + #endif /* ODB_H */
     
      ## t/meson.build ##
     @@ t/meson.build: integration_tests = [
  • 29: a89f77a = 29: 9bebe8f sha1_file: when writing objects, skip the read_object_hook

  • 30: ffe42e3 ! 30: 2716d90 gvfs: add global command pre and post hook procs

    @@ git.c
      
      #define RUN_SETUP		(1<<0)
      #define RUN_SETUP_GENTLY	(1<<1)
    -@@ git.c: static int handle_alias(struct strvec *args)
    +@@ git.c: static int handle_alias(struct strvec *args, struct string_list *expanded_aliase
      	return ret;
      }
      
    @@ git.c: static void execv_dashed_external(const char **argv)
     +	run_post_command_hook(the_repository);
      }
      
    - static int run_argv(struct strvec *args)
    + static int is_deprecated_command(const char *cmd)
     @@ git.c: int cmd_main(int argc, const char **argv)
      	}
      
  • 31: ee384bf = 31: ae148ec t0400: verify that the hook is called correctly from a subdirectory

  • 32: e9c76cc = 32: b378722 t0400: verify core.hooksPath is respected by pre-command

  • 33: cea9392 = 33: b64c400 Pass PID of git process to hooks.

  • 34: c60cfec = 34: 1f93e86 sparse-checkout: make sure to update files with a modify/delete conflict

  • 35: b071c70 = 35: 711237c worktree: allow in Scalar repositories

  • 36: 3f1dc85 = 36: f942dab sparse-checkout: avoid writing entries with the skip-worktree bit

  • 37: 1a3a601 = 37: db29c1d Do not remove files outside the sparse-checkout

  • 38: e5fa645 = 38: 835ec69 send-pack: do not check for sha1 file when GVFS_MISSING_OK set

  • 39: d1b4308 = 39: 4b85889 gvfs: allow corrupt objects to be re-downloaded

  • 40: 0a3eea2 = 40: 766312f cache-tree: remove use of strbuf_addf in update_one

  • 41: dd7af67 ! 41: e0629a1 gvfs: block unsupported commands when running in a GVFS repo

    @@ git.c
      #include "environment.h"
      #include "exec-cmd.h"
     @@
    - #define NEED_WORK_TREE		(1<<3)
      #define DELAY_PAGER_CONFIG	(1<<4)
      #define NO_PARSEOPT		(1<<5) /* parse-options is not used */
    -+#define BLOCK_ON_GVFS_REPO	(1<<6) /* command not allowed in GVFS repos */
    + #define DEPRECATED		(1<<6)
    ++#define BLOCK_ON_GVFS_REPO	(1<<7) /* command not allowed in GVFS repos */
      
      struct cmd_struct {
      	const char *cmd;
    @@ git.c: static struct cmd_struct commands[] = {
      	{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
     @@ git.c: static struct cmd_struct commands[] = {
      #ifndef WITH_BREAKING_CHANGES
    - 	{ "whatchanged", cmd_whatchanged, RUN_SETUP },
    + 	{ "whatchanged", cmd_whatchanged, RUN_SETUP | DEPRECATED },
      #endif
     -	{ "worktree", cmd_worktree, RUN_SETUP },
     +	{ "worktree", cmd_worktree, RUN_SETUP | BLOCK_ON_GVFS_REPO },
  • 42: c3dd24d = 42: 9ddff12 gvfs: allow overriding core.gvfs

  • 43: bbe6511 = 43: 5c7ab92 BRANCHES.md: Add explanation of branches and using forks

  • 83: 65fc894 ! 44: 7429f9b git.c: add VFS enabled cmd blocking

    @@ Commit message
     
      ## git.c ##
     @@
    - #define DELAY_PAGER_CONFIG	(1<<4)
      #define NO_PARSEOPT		(1<<5) /* parse-options is not used */
    - #define BLOCK_ON_GVFS_REPO	(1<<6) /* command not allowed in GVFS repos */
    -+#define BLOCK_ON_VFS_ENABLED	(1<<7) /* command not allowed when virtual file system is used */
    + #define DEPRECATED		(1<<6)
    + #define BLOCK_ON_GVFS_REPO	(1<<7) /* command not allowed in GVFS repos */
    ++#define BLOCK_ON_VFS_ENABLED	(1<<8) /* command not allowed when virtual file system is used */
      
      struct cmd_struct {
      	const char *cmd;
  • 84: 60e8fd2 = 45: 06717d5 git.c: permit repack cmd in Scalar repos

  • 85: 76ea260 = 46: 36c2358 git.c: permit fsck cmd in Scalar repos

  • 86: 2c8f0a2 = 47: 8265735 git.c: permit prune cmd in Scalar repos

  • 87: df7fac9 ! 48: ecfc8f6 worktree: remove special case GVFS cmd blocking

    @@ builtin/worktree.c: int cmd_worktree(int ac,
      ## git.c ##
     @@ git.c: static struct cmd_struct commands[] = {
      #ifndef WITH_BREAKING_CHANGES
    - 	{ "whatchanged", cmd_whatchanged, RUN_SETUP },
    + 	{ "whatchanged", cmd_whatchanged, RUN_SETUP | DEPRECATED },
      #endif
     -	{ "worktree", cmd_worktree, RUN_SETUP | BLOCK_ON_GVFS_REPO },
     +	{ "worktree", cmd_worktree, RUN_SETUP | BLOCK_ON_VFS_ENABLED },
  • 89: a617500 = 49: a3328e8 Add virtual file system settings and hook proc

  • 90: e45d4e4 = 50: 5cc055c virtualfilesystem: don't run the virtual file system hook if the index has been redirected

  • 91: 1316efb = 51: 063c89e virtualfilesystem: check if directory is included

  • 92: b9554de = 52: 9f02e60 backwards-compatibility: support the post-indexchanged hook

  • 88: ac28b74 = 53: 277b059 builtin/repack.c: emit warning when shared cache is present

  • 93: 8edf1aa = 54: 505e1b9 gvfs: verify that the built-in FSMonitor is disabled

  • 94: d76576f = 55: eea3547 wt-status: add trace2 data for sparse-checkout percentage

  • 95: c6143cb = 56: cf481a8 status: add status serialization mechanism

  • 96: 921f2e5 = 57: f9dc1eb Teach ahead-behind and serialized status to play nicely together

  • 97: 8b6cf9e = 58: fb6d0fa status: serialize to path

  • 98: deb4ae4 = 59: fedfb7f status: reject deserialize in V2 and conflicts

  • 99: a85a5c5 = 60: a3abe6d serialize-status: serialize global and repo-local exclude file metadata

  • 100: ba76c85 = 61: 0bc9d5c status: deserialization wait

  • 101: b11be90 = 62: 8fa2cbc status: deserialize with -uno does not print correct hint

  • 102: c743550 = 63: 819a038 fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 103: 2cfa766 = 64: 3f5a72b fsmonitor: add script for debugging and update script for tests

  • 104: 151eaa6 = 65: 72726f7 status: disable deserialize when verbose output requested.

  • 105: 72c8020 = 66: 2910d75 t7524: add test for verbose status deserialzation

  • 106: ac29ff3 = 67: f3cafd6 deserialize-status: silently fallback if we cannot read cache file

  • 107: 6888e81 = 68: 893efbf gvfs:trace2:data: add trace2 tracing around read_object_process

  • 108: 2e423a5 = 69: c883ec2 gvfs:trace2:data: status deserialization information

  • 109: 67a0120 = 70: e0f54bd gvfs:trace2:data: status serialization

  • 110: 81461ba = 71: 922c332 gvfs:trace2:data: add vfs stats

  • 111: 5f20649 = 72: 0a87f6d trace2: refactor setting process starting time

  • 112: 2fe3184 = 73: 897f249 trace2:gvfs:experiment: clear_ce_flags_1

  • 113: fa48c00 = 74: 1947e0c trace2:gvfs:experiment: report_tracking

  • 114: ef9c77b = 75: c27d62e trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 115: e520578 = 76: f8473a1 trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

  • 116: 11bcb15 = 77: d953d88 trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 117: 33bc7f4 = 78: 4118c60 trace2:gvfs:experiment: add region around unpack_trees()

  • 118: 7d95378 = 79: e746515 trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 119: b69ac05 = 80: 2a135b9 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

  • 120: 503280a = 81: bfdd3ea trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 121: 45f105d = 82: 8929a1e trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 122: d9d555b = 83: 17b2ed6 Trace2:gvfs:experiment: capture more 'tracking' details

  • 123: 3083bc6 = 84: b548870 credential: set trace2_child_class for credential manager children

  • 124: b37557c = 85: a2f150b sub-process: do not borrow cmd pointer from caller

  • 125: 3759d28 = 86: 8ea854d sub-process: add subprocess_start_argv()

  • 126: 73bf0a2 = 87: 3d8b9e8 sha1-file: add function to update existing loose object cache

  • 127: dd008b9 = 88: ec20cc1 packfile: add install_packed_git_and_mru()

  • 128: b0f99d6 = 89: 701ddaa index-pack: avoid immediate object fetch while parsing packfile

  • 129: 2afc646 = 90: 2a92a2b gvfs-helper: create tool to fetch objects using the GVFS Protocol

  • 130: d319cd3 = 91: cb9e0b6 sha1-file: create shared-cache directory if it doesn't exist

  • 131: 1be93e3 = 92: 20e8b31 gvfs-helper: better handling of network errors

  • 132: 4b65a0a = 93: 73beff2 gvfs-helper-client: properly update loose cache with fetched OID

  • 133: 29ef905 = 94: f05f6f4 gvfs-helper: V2 robust retry and throttling

  • 134: bd3edb0 = 95: 41e572d gvfs-helper: expose gvfs/objects GET and POST semantics

  • 135: 63ead88 = 96: 77194ac gvfs-helper: dramatically reduce progress noise

  • 136: 4f0294c = 97: 66ebb9d gvfs-helper: handle pack-file after single POST request

  • 137: 1f51b24 = 98: b9af928 test-gvfs-prococol, t5799: tests for gvfs-helper

  • 138: 985b236 = 99: 455103b gvfs-helper: move result-list construction into install functions

  • 44: 94373ba = 100: e9eafd3 git_config_set_multivar_in_file_gently(): add a lock timeout

  • 45: 11a2311 = 101: d6f17b4 scalar: set the config write-lock timeout to 150ms

  • 46: 8989c91 = 102: 9a16d21 scalar: add docs from microsoft/scalar

  • 47: 7d51afb = 103: b94d7e5 scalar (Windows): use forward slashes as directory separators

  • 48: a9d495c = 104: a31091c scalar: add retry logic to run_git()

  • 49: 33492f4 = 105: 7af71f1 scalar: support the config command for backwards compatibility

  • 82: 63e211e = 106: 3babd4a TO-UPSTREAM: sequencer: avoid progress when stderr is redirected

  • 50: 9bcbf80 = 107: c3278c0 clar: pass a string for a %s format placeholder

  • 56: 76baaf0 = 108: 31f44c4 cat_one_file(): make it easy to see that the size variable is initialized

  • 58: b1783b5 = 109: cd69594 fsck: avoid using an uninitialized variable

  • 51: a169eee = 110: 235e82f clar(clar__assert_equal): do in-bounds check before accessing element

  • 60: e22cd64 = 111: 8a7cc1d load_revindex_from_disk(): avoid accessing uninitialized data

  • 52: 6bf50b8 = 112: fcee331 clar(clar_summary_testsuite): avoid thread-unsafe localtime()

  • 53: af445c6 = 113: 88f66d6 revision: defensive programming

  • 54: 5b7b413 = 114: 803d18e get_parent(): defensive programming

  • 55: 10c3382 = 115: bfd67d0 fetch-pack: defensive programming

  • 57: 7ff6da7 = 116: 3b1f728 unparse_commit(): defensive programming

  • 59: 941f845 = 117: ff9fd73 verify_commit_graph(): defensive programming

  • 62: ef58275 = 118: bc9dcbe load_pack_mtimes_file(): avoid accessing uninitialized data

  • 61: 4f36f26 = 119: 90d4b59 stash: defensive programming

  • 63: 85ee0af = 120: 44f9588 stash: defensive programming

  • 65: 8bd7710 = 121: 17979de push: defensive programming

  • 67: b622d9c = 122: 33802a8 fetch: defensive programming

  • 69: f1a20b2 = 123: 7e5241f describe: defensive programming

  • 71: 5fbad77 = 124: 07c9ac9 inherit_tracking(): defensive programming

  • 64: 167f6c4 = 125: cf30419 fetch: silence a CodeQL alert about a local variable's address' use after release

  • 66: fea59c1 = 126: 33b3aff submodule: check return value of submodule_from_path()

  • 68: abcbfda = 127: c0278b4 test-tool repository: check return value of lookup_commit()

  • 70: e9e3617 = 128: f8bff64 shallow: handle missing shallow commits gracefully

  • 73: 2dff903 = 129: 5fa0b74 codeql: run static analysis as part of CI builds

  • 72: 76bc72d = 130: 1935c02 commit-graph: suppress warning about using a stale stack addresses

  • 74: 124bf82 = 131: db8ac1f codeql: publish the sarif file as build artifact

  • 75: 8c7f287 = 132: e9ba1f0 codeql: disable a couple of non-critical queries for now

  • 76: a0eca08 = 133: 416e307 date: help CodeQL understand that there are no leap-year issues here

  • 77: 43ee036 = 134: 40543e1 help: help CodeQL understand that consuming envvars is okay here

  • 78: f4ed195 = 135: d857192 ctype: help CodeQL understand that sane_istest() does not access array past end

  • 79: 6b15252 = 136: e083721 ctype: accommodate for CodeQL misinterpreting the z in mallocz()

  • 80: f812442 = 137: 38427e5 strbuf_read: help with CodeQL misunderstanding that strbuf_read() does NUL-terminate correctly

  • 81: 730fb73 = 138: dcf0dbb codeql: also check JavaScript code

  • 139: 67147e6 ! 139: 7f11d48 t5799: add support for POST to return either a loose object or packfile

    @@ t/helper/test-gvfs-protocol.c: static enum worker_result send_loose_object(const
     +	 * Since `test-gvfs-protocol` is mocking a real GVFS server (cache or
     +	 * main), we don't want a request for a missing object to cause the
     +	 * implicit dynamic fetch mechanism to try to fault-it-in (and cause
    -+	 * our call to oid_object_info_extended() to launch another instance
    ++	 * our call to odb_read_object_info_extended() to launch another instance
     +	 * of `gvfs-helper` to magically fetch it (which would connect to a
     +	 * new instance of `test-gvfs-protocol`)).
     +	 *
    @@ t/helper/test-gvfs-protocol.c: static enum worker_result send_loose_object(const
     +	oi.sizep = &size;
     +	oi.contentp = &content;
     +
    -+	if (oid_object_info_extended(the_repository, oid, &oi, flags)) {
    ++	if (odb_read_object_info_extended(the_repository->objects, oid, &oi, flags)) {
     +		logerror("Could not find OID: '%s'", oid_to_hex(oid));
     +		free(content);
     +		return send_http_error(1, 404, "Not Found", -1, WR_OK);
    @@ t/helper/test-gvfs-protocol.c: static enum worker_result send_packfile_from_buff
     +
     +	oidset_iter_init(oids, &iter);
     +	while ((oid = oidset_iter_next(&iter))) {
    -+		if (!oid_object_info_extended(the_repository, oid, &oi, flags) &&
    ++		if (!odb_read_object_info_extended(the_repository->objects, oid, &oi, flags) &&
     +		    type == OBJ_COMMIT) {
     +			*need_packfile = 1;
     +			return WR_OK;
  • 140: d7f6602 = 140: f76e806 t5799: cleanup wc-l and grep-c lines

  • 141: 14a45f0 = 141: 75ef613 gvfs-helper: verify loose objects after write

  • 142: 9ed7ef6 = 142: ae7e6bd t7599: create corrupt blob test

  • 143: c94285f = 143: cbab2dd gvfs-helper: add prefetch support

  • 144: e2efbf1 = 144: 70e2a56 gvfs-helper: add prefetch .keep file for last packfile

  • 145: e2b8332 = 145: e4eb3fb gvfs-helper: do one read in my_copy_fd_len_tail()

  • 146: 3c3f0b2 = 146: a70f1a0 gvfs-helper: move content-type warning for prefetch packs

  • 147: 34f6690 = 147: 5c71d78 fetch: use gvfs-helper prefetch under config

  • 148: 38a5bf5 = 148: d774e33 gvfs-helper: better support for concurrent packfile fetches

  • 149: e6d34f5 = 149: ad5b700 remote-curl: do not call fetch-pack when using gvfs-helper

  • 150: c0ccdd3 = 150: 4f0c34c fetch: reprepare packs before checking connectivity

  • 151: 25a7fb5 = 151: 6cc75ba gvfs-helper: retry when creating temp files

  • 152: 77a0de5 = 152: 4348168 sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 153: ec83624 = 153: 818b0a6 gvfs-helper: add --max-retries to prefetch verb

  • 154: 7a64fd6 = 154: 24dfd70 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 155: 8958b4e = 155: 54416d9 gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 156: e5457e7 = 156: fb99416 t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 157: 5992e90 = 157: c7eac21 gvfs-helper: don't fallback with new config

  • 159: ae7052a = 158: 475ef90 maintenance: care about gvfs.sharedCache config

  • 158: 0cfb85f = 159: 01ad36c test-gvfs-protocol: add cache_http_503 to mayhem

  • 161: 416e051 = 160: f98901c unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 160: b404b9d = 161: c4ce7d3 t5799: add unit tests for new gvfs.fallback config setting

  • 162: 85f0e90 = 162: d77b9ed homebrew: add GitHub workflow to release Cask

  • 163: bcb068e = 163: af6c9f1 Adding winget workflows

  • 164: 9f049a8 = 164: d006226 Disable the monitor-components workflow in msft-git

  • 165: 35b336a = 165: cf6de4f .github: enable windows builds on microsoft fork

  • 166: c781010 = 166: edd1b4f .github/actions/akv-secret: add action to get secrets

  • 167: 4b92719 = 167: 14dbd9f release: create initial Windows installer build workflow

  • 168: c78d3f2 = 168: e608427 release: create initial Windows installer build workflow

  • 169: 2a7c6a5 = 169: acfe2fc help: special-case HOST_CPU universal

  • 170: 81e0e90 = 170: 747a9c2 release: add Mac OSX installer build

  • 171: d166efa = 171: 49461e7 release: build unsigned Ubuntu .deb package

  • 172: 4915f5e = 172: a3d5c0c release: add signing step for .deb package

  • 173: 6117939 = 173: 934f1cc release: create draft GitHub release with packages & installers

  • 174: f554aef = 174: 9becca0 build-git-installers: publish gpg public key

  • 175: e6d16fb = 175: 6810978 release: continue pestering until user upgrades

  • 176: 3311cb8 = 176: b866ed7 dist: archive HEAD instead of HEAD^{tree}

  • 178: 7cfeb24 = 177: 96c8f85 update-microsoft-git: create barebones builtin

  • 177: bfa26a5 = 178: 7386ac3 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 180: f24aa2b = 179: eaf364a update-microsoft-git: Windows implementation

  • 179: 6299325 = 180: c203a6f release: add installer validation

  • 181: dfda901 = 181: 12ccfa3 update-microsoft-git: use brew on macOS

  • 182: 58b6c84 = 182: 448e336 .github: reinstate ISSUE_TEMPLATE.md for microsoft/git

  • 183: 3627a3b = 183: 16dd9e2 .github: update PULL_REQUEST_TEMPLATE.md

  • 184: 61c4ba9 = 184: d3900eb Adjust README.md for microsoft/git

  • 185: a010a4a = 185: 9f1538c scalar: implement a minimal JSON parser

  • 186: 8419a7c = 186: a202889 scalar clone: support GVFS-enabled remote repositories

  • 187: c5fdf48 = 187: ffbf051 test-gvfs-protocol: also serve smart protocol

  • 188: ef74459 = 188: 3e221e5 gvfs-helper: add the endpoint command

  • 189: 8f2004c = 189: 32c61eb dir_inside_of(): handle directory separators correctly

  • 190: ffe54d5 = 190: eea7ccc scalar: disable authentication in unattended mode

  • 191: f096e83 = 191: 0c96401 abspath: make strip_last_path_component() global

  • 192: 48f0edb = 192: a2b207f scalar: do initialize gvfs.sharedCache

  • 193: 3c3e7ab = 193: 1e7b136 scalar diagnose: include shared cache info

  • 194: 8ba10e3 = 194: 77a9b65 scalar: only try GVFS protocol on https:// URLs

  • 195: 575c840 = 195: 609bbd3 scalar: verify that we can use a GVFS-enabled repository

  • 196: 6328021 = 196: 02c6507 scalar: add the cache-server command

  • 197: e4c4a29 = 197: 20ba7a4 scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 198: 53827d0 = 198: 279c4cc scalar: adjust documentation to the microsoft/git fork

  • 199: ae4faec = 199: f99ca9c scalar: enable untracked cache unconditionally

  • 200: 04c35a7 = 200: 6129c4d scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 201: 52fb3cd = 201: 5afd2a7 scalar: make GVFS Protocol a forced choice

  • 202: cbd4db7 = 202: 64df7cd scalar: work around GVFS Protocol HTTP/2 failures

  • 207: cc2b31d = 203: 9f5b83f gvfs-helper-client: clean up server process(es)

  • 208: 1242ee3 = 204: 6487b77 scalar diagnose: accommodate Scalar's Functional Tests

  • 209: 48c9a90 = 205: b7021e3 ci: run Scalar's Functional Tests

  • 210: 0b3edf1 = 206: e8011dc scalar: upgrade to newest FSMonitor config setting

  • 203: dad07df = 207: 39bb28f add/rm: allow adding sparse entries when virtual

  • 204: 9da5496 = 208: f957c31 sparse-checkout: add config to disable deleting dirs

  • 205: 733ca3f = 209: f044e6b diff: ignore sparse paths in diffstat

  • 206: c5f641f = 210: fbb0259 repo-settings: enable sparse index by default

  • 211: cf27131 = 211: 7d3e549 TO-CHECK: t1092: use quiet mode for rebase tests

  • 212: 3c4fc00 = 212: 154322a reset: fix mixed reset when using virtual filesystem

  • 213: d4dbcd3 = 213: 29d30d0 diff(sparse-index): verify with partially-sparse

  • 214: 5f34663 = 214: db227a7 stash: expand testing for git stash -u

  • 215: b9bc506 = 215: d7d517a sparse-index: add ensure_full_index_with_reason()

  • 216: 80d4d98 = 216: 6996f9a treewide: add reasons for expanding index

  • 217: 6902355 = 217: b6b8609 treewide: custom reasons for expanding index

  • 218: 521815b = 218: a2dfb18 sparse-index: add macro for unaudited expansions

  • 219: 998ede7 = 219: afbc877 Docs: update sparse index plan with logging

  • 220: 01244dd = 220: 3203a24 sparse-index: log failure to clear skip-worktree

  • 221: a3ced42 = 221: 41c85bf stash: use -f in checkout-index child process

  • 222: 07dc95b = 222: e553a21 sparse-index: do not copy hashtables during expansion

  • 223: a8f0ded = 223: c4b7238 TO-DROP: bogus left-over from 'sparse-checkout: make 'clean' clear more files'

  • 224: 0f8e308 = 224: a4ebd45 TO-DROP: left-over from 'sparse-checkout: mark 'clean' as experimental'

  • 225: 9fbca04 = 225: 380c386 TO-UPSTREAM: sub-process: avoid leaking cmd

  • 226: c572500 = 226: 78c44fc remote-curl: release filter options before re-setting them

  • 227: 4dceb9c = 227: 05723fe transport: release object filter options

  • 228: 9f3bd29 = 228: d075959 push: don't reuse deltas with path walk

  • 229: 70870e9 = 229: e61f903 t7900-maintenance.sh: reset config between tests

  • 230: 9032ac1 = 230: 5299ffc maintenance: add cache-local-objects maintenance task

  • 231: d18131a = 231: bd8dd4d scalar.c: add cache-local-objects task

  • 232: 0100922 = 232: e909d5f hooks: add custom post-command hook config

  • 233: 35a9a62 = 233: e478c20 TO-UPSTREAM: Docs: fix asciidoc failures from short delimiters

  • 234: a978203 = 234: c7efb74 hooks: make hook logic memory-leak free

  • 235: a47821f = 235: 85374fe TO-DROP: t5309: create failing test for 'git index-pack'

  • -: ------------ > 236: 289f7ca fixup! TO-DROP: t5309: create failing test for 'git index-pack'

  • -: ------------ > 237: fb57ea9 fixup! TO-DROP: left-over from 'sparse-checkout: mark 'clean' as experimental'

  • -: ------------ > 238: cdb99b8 fixup! TO-DROP: bogus left-over from 'sparse-checkout: make 'clean' clear more files'

@dscho dscho merged commit cdb99b8 into vfs-2.51.1 Oct 17, 2025
189 of 201 checks passed
@dscho dscho deleted the tentative/vfs-2.51.1 branch October 17, 2025 21:10
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.