Skip to content

Rebase onto Git for Windows v2.53.0-rc2.windows.1#854

Merged
dscho merged 301 commits intomicrosoft:vfs-2.53.0-rc2from
dscho:tentative/vfs-2.53.0-rc2
Jan 31, 2026
Merged

Rebase onto Git for Windows v2.53.0-rc2.windows.1#854
dscho merged 301 commits intomicrosoft:vfs-2.53.0-rc2from
dscho:tentative/vfs-2.53.0-rc2

Conversation

@dscho
Copy link
Member

@dscho dscho commented Jan 30, 2026

This PR rebases Microsoft Git patches onto Git for Windows v2.53.0-rc2.windows.1.

Previous base: vfs-2.53.0-rc1

Range-diff vs vfs-2.53.0-rc1
  • 1: 9e2a1d6 = 1: 287b140 sparse-index.c: fix use of index hashes in expand_index
  • 2: 0e4ee44 = 2: f7bc717 t5300: confirm failure of git index-pack when non-idx suffix requested
  • 3: 61436a0 = 3: 10c4edd t: remove advice from some tests
  • 4: fef4331 = 4: b584c12 t1092: add test for untracked files and directories
  • 5: 6f9e052 = 5: 2f7cc89 index-pack: disable rev-index if index file has non .idx suffix
  • 6: 7c50f1b = 6: f9930c2 trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup
  • 7: 1c6295a = 7: ab5e1ca survey: calculate more stats on refs
  • 8: 4aff52a = 8: 7478ed0 survey: show some commits/trees/blobs histograms
  • 9: 90bda47 = 9: 7260196 survey: add vector of largest objects for various scaling dimensions
  • 10: 42ef48c = 10: be8c29d survey: add pathname of blob or tree to large_item_vec
  • 11: 0e36b2b = 11: 418905e survey: add commit-oid to large_item detail
  • 12: 6a82d1d = 12: d5bd1e3 survey: add commit name-rev lookup to each large_item
  • 13: 82f7e11 = 13: b588699 survey: add --no-name-rev option
  • 14: bd8ce3c = 14: 20d39e0 survey: started TODO list at bottom of source file
  • 15: 8c2fa2c = 15: f0e8e45 survey: expanded TODO list at the bottom of the source file
  • 16: a88dcf8 = 16: b945c00 survey: expanded TODO with more notes
  • 17: a73346c = 17: 6d27cc6 reset --stdin: trim carriage return from the paths
  • 18: c5b6117 ! 18: 2f8a0a7 Identify microsoft/git via a distinct version suffix
    @@ Commit message
      ## GIT-VERSION-GEN ##
     @@
      
    - DEF_VER=v2.53.0-rc0
    + DEF_VER=v2.53.0-rc2
      
     +# Identify microsoft/git via a distinct version suffix
     +DEF_VER=$DEF_VER.vfs.0.0
  • 19: caf2ce8 = 19: 93aa0a5 gvfs: ensure that the version is based on a GVFS tag
  • 20: 62eb5f5 = 20: cf0ffd0 gvfs: add a GVFS-specific header file
  • 21: bae9917 = 21: 55a5071 gvfs: add the core.gvfs config setting
  • 22: c2edd7f = 22: 957850b gvfs: add the feature to skip writing the index' SHA-1
  • 23: 4207fd0 = 23: d35f852 gvfs: add the feature that blobs may be missing
  • 24: 199ddef = 24: 8825b93 gvfs: prevent files to be deleted outside the sparse checkout
  • 25: fadd59d = 25: 8c39e21 gvfs: optionally skip reachability checks/upload pack during fetch
  • 26: ca883f1 = 26: 55ebc44 gvfs: ensure all filters and EOL conversions are blocked
  • 27: 0df7e63 ! 27: 5a63e35 gvfs: allow "virtualizing" objects
    @@ environment.c: int core_sparse_checkout_cone;
      int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
      unsigned long pack_size_limit_cfg;
     +int core_virtualize_objects;
    - int max_allowed_tree_depth =
    - #ifdef _MSC_VER
    - 	/*
    + 
    + #ifndef PROTECT_HFS_DEFAULT
    + #define PROTECT_HFS_DEFAULT 0
     
      ## environment.h ##
     @@ environment.h: extern int auto_comment_line_char;
  • 28: 2ba13ff = 28: 11e3dda Hydrate missing loose objects in check_and_freshen()
  • 29: 74a4698 = 29: fce7f0f sha1_file: when writing objects, skip the read_object_hook
  • 30: caadfd5 = 30: 869c011 gvfs: add global command pre and post hook procs
  • 31: 19d336a = 31: 20c7ea2 t0400: verify that the hook is called correctly from a subdirectory
  • 32: 4b06566 = 32: ac7fb9d t0400: verify core.hooksPath is respected by pre-command
  • 33: cf0c109 = 33: 90230b8 Pass PID of git process to hooks.
  • 34: 637b446 = 34: ba09f4a sparse-checkout: make sure to update files with a modify/delete conflict
  • 35: 9972d79 = 35: d9307ff worktree: allow in Scalar repositories
  • 36: c9c73fe = 36: a60d031 sparse-checkout: avoid writing entries with the skip-worktree bit
  • 37: 3ba5b40 = 37: 312f99b Do not remove files outside the sparse-checkout
  • 38: 031d1e9 = 38: 4495061 send-pack: do not check for sha1 file when GVFS_MISSING_OK set
  • 39: 6b72022 = 39: 55879bc gvfs: allow corrupt objects to be re-downloaded
  • 40: 1838855 = 40: d9ec870 cache-tree: remove use of strbuf_addf in update_one
  • 41: 0ce3ce1 = 41: 46429bb gvfs: block unsupported commands when running in a GVFS repo
  • 42: 15f55e3 = 42: f8cdb0d gvfs: allow overriding core.gvfs
  • 43: 6aa0063 = 43: 0777d10 BRANCHES.md: Add explanation of branches and using forks
  • 44: f2d71b3 = 44: c3cd018 git.c: add VFS enabled cmd blocking
  • 45: c24dfb8 = 45: b838900 git.c: permit repack cmd in Scalar repos
  • 48: 5c9c248 ! 46: a1809c9 Add virtual file system settings and hook proc
    @@ environment.c: int git_default_core_config(const char *var, const char *value,
      
     
      ## environment.h ##
    -@@ environment.h: extern int pack_compression_level;
    +@@ environment.h: extern int zlib_compression_level;
    + extern int pack_compression_level;
      extern unsigned long pack_size_limit_cfg;
    - extern int max_allowed_tree_depth;
      
     +extern char *core_virtualfilesystem;
      extern int precomposed_unicode;
  • 46: bb62e6f = 47: 076bfb4 git.c: permit fsck cmd in Scalar repos
  • 50: cea4243 = 48: 28e3963 virtualfilesystem: don't run the virtual file system hook if the index has been redirected
  • 47: 5f1e45e = 49: 539650e git.c: permit prune cmd in Scalar repos
  • 52: 74ffce5 = 50: 06991f9 virtualfilesystem: check if directory is included
  • 49: 598f2f6 = 51: aa42f6d worktree: remove special case GVFS cmd blocking
  • 53: ecfff97 = 52: d809a0e backwards-compatibility: support the post-indexchanged hook
  • 51: c659ddf = 53: 45aedb9 builtin/repack.c: emit warning when shared cache is present
  • 54: ca7d7c5 = 54: f677f85 gvfs: verify that the built-in FSMonitor is disabled
  • 55: 2a6681e = 55: 102b290 wt-status: add trace2 data for sparse-checkout percentage
  • 56: ff20263 = 56: c404233 status: add status serialization mechanism
  • 57: e07dcd6 = 57: a88fb44 Teach ahead-behind and serialized status to play nicely together
  • 58: cf5c237 = 58: ef4a47e status: serialize to path
  • 59: 4e8c83a = 59: 14d6835 status: reject deserialize in V2 and conflicts
  • 60: f1c2a69 = 60: 3cf9f3a serialize-status: serialize global and repo-local exclude file metadata
  • 61: bd6a03d = 61: 51b0b3c status: deserialization wait
  • 62: bab785f = 62: 8de3f09 status: deserialize with -uno does not print correct hint
  • 63: 8497b65 = 63: f64178d fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate
  • 64: 42b877f = 64: 3c9a9fe fsmonitor: add script for debugging and update script for tests
  • 65: 5fa0007 = 65: b0393b5 status: disable deserialize when verbose output requested.
  • 66: 3ab9d3a = 66: 4d1fa93 t7524: add test for verbose status deserialzation
  • 67: c297695 = 67: f07afe3 deserialize-status: silently fallback if we cannot read cache file
  • 68: e4c6179 = 68: 9c6145e gvfs:trace2:data: add trace2 tracing around read_object_process
  • 69: df02e7e = 69: 18447c9 gvfs:trace2:data: status deserialization information
  • 70: 86dc249 = 70: 6c407c8 gvfs:trace2:data: status serialization
  • 71: abe5a72 = 71: 8a4bbe6 gvfs:trace2:data: add vfs stats
  • 72: 2327a3b = 72: 14ad3bb trace2: refactor setting process starting time
  • 73: e2bf764 = 73: e39f660 trace2:gvfs:experiment: clear_ce_flags_1
  • 74: f9933a8 = 74: af3915e trace2:gvfs:experiment: report_tracking
  • 75: 0761c47 = 75: 28d4cb6 trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache
  • 76: f08f566 = 76: 78e47e4 trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension
  • 77: 9ce7b52 = 77: ecc29fd trace2:gvfs:experiment: add region to apply_virtualfilesystem()
  • 78: 546a908 = 78: 13fe317 trace2:gvfs:experiment: add region around unpack_trees()
  • 79: 560d494 = 79: 37cd5e3 trace2:gvfs:experiment: add region to cache_tree_fully_valid()
  • 80: 90725de = 80: 58855f4 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()
  • 81: d4d5c5a = 81: d2135ae trace2:gvfs:experiment: increase default event depth for unpack-tree data
  • 82: 2d9642d = 82: 3306ad6 trace2:gvfs:experiment: add data for check_updates() in unpack_trees()
  • 83: bd4e206 = 83: c7963ca Trace2:gvfs:experiment: capture more 'tracking' details
  • 84: deca77a = 84: f464c96 credential: set trace2_child_class for credential manager children
  • 85: acfeba2 = 85: 747dbe7 sub-process: do not borrow cmd pointer from caller
  • 86: 91d3c70 = 86: 202eb12 sub-process: add subprocess_start_argv()
  • 87: 9d27fd7 = 87: 25a80f3 sha1-file: add function to update existing loose object cache
  • 88: d7d3504 = 88: 84a1cf8 index-pack: avoid immediate object fetch while parsing packfile
  • 89: 71074cc = 89: f568365 gvfs-helper: create tool to fetch objects using the GVFS Protocol
  • 90: 381d457 = 90: 2721f5d sha1-file: create shared-cache directory if it doesn't exist
  • 91: 40c5d36 = 91: 4c7dfe3 gvfs-helper: better handling of network errors
  • 92: b7a7554 = 92: 02b8b7b gvfs-helper-client: properly update loose cache with fetched OID
  • 93: 36b0a57 = 93: 3f83022 gvfs-helper: V2 robust retry and throttling
  • 94: 36164f6 = 94: f48e37b gvfs-helper: expose gvfs/objects GET and POST semantics
  • 95: 0e32026 = 95: 8197c00 gvfs-helper: dramatically reduce progress noise
  • 96: 5e3e65a = 96: d41f5b1 gvfs-helper: handle pack-file after single POST request
  • 97: 4cc2481 = 97: 45b34e2 test-gvfs-prococol, t5799: tests for gvfs-helper
  • 98: 5c96acc = 98: 3867abe gvfs-helper: move result-list construction into install functions
  • 99: 1ad996c = 99: e74c6fa t5799: add support for POST to return either a loose object or packfile
  • 100: 0c2c35f = 100: d340c76 t5799: cleanup wc-l and grep-c lines
  • 101: d13767e = 101: 49d9dc2 gvfs-helper: verify loose objects after write
  • 102: 915542c = 102: ddd89f1 t7599: create corrupt blob test
  • 103: b6f89e2 = 103: a25a20f gvfs-helper: add prefetch support
  • 104: b076cd3 = 104: 8a0fc3a gvfs-helper: add prefetch .keep file for last packfile
  • 105: af66089 = 105: db5d5a6 gvfs-helper: do one read in my_copy_fd_len_tail()
  • 106: 8ed3089 = 106: 9bb476f gvfs-helper: move content-type warning for prefetch packs
  • 107: 29e468a = 107: 894c802 fetch: use gvfs-helper prefetch under config
  • 108: 4b0caf5 = 108: df05ece gvfs-helper: better support for concurrent packfile fetches
  • 109: f394d2c = 109: dd864af remote-curl: do not call fetch-pack when using gvfs-helper
  • 110: cdb92b9 = 110: 041a862 fetch: reprepare packs before checking connectivity
  • 111: 4082186 = 111: a7a1f29 gvfs-helper: retry when creating temp files
  • 112: 812d03e = 112: 3e4ec70 sparse: avoid warnings about known cURL issues in gvfs-helper.c
  • 113: 344eeb1 = 113: f484e21 gvfs-helper: add --max-retries to prefetch verb
  • 114: 0268d56 = 114: e8eced7 t5799: add tests to detect corrupt pack/idx files in prefetch
  • 115: 1f6444a = 115: 1bf08c6 gvfs-helper: ignore .idx files in prefetch multi-part responses
  • 119: c4fccb9 = 116: f605b55 maintenance: care about gvfs.sharedCache config
  • 121: 8316810 = 117: 31f2fd3 unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags
  • 122: ff04b4c = 118: 3c152c5 homebrew: add GitHub workflow to release Cask
  • 123: 0923367 = 119: 858f856 Adding winget workflows
  • 116: e976c4d = 120: 34a9f60 t5799: explicitly test gvfs-helper --fallback and --no-fallback
  • 124: b88704c = 121: a8ca7bf Disable the monitor-components workflow in msft-git
  • 117: 8375b94 = 122: d9f2fe4 gvfs-helper: don't fallback with new config
  • 125: d19e4bc = 123: 3f172a1 .github: enable windows builds on microsoft fork
  • 118: af8d9e9 = 124: 6965495 test-gvfs-protocol: add cache_http_503 to mayhem
  • 126: bfcbfb6 = 125: a58dc4b .github/actions/akv-secret: add action to get secrets
  • 120: 70a014b = 126: 3a3b909 t5799: add unit tests for new gvfs.fallback config setting
  • 127: db9b076 = 127: a44e908 release: create initial Windows installer build workflow
  • 128: 195dc0e = 128: f8ecb62 release: create initial Windows installer build workflow
  • 129: f6606b3 = 129: 9b28aa1 help: special-case HOST_CPU universal
  • 130: 739a7b1 = 130: 7aa42d6 release: add Mac OSX installer build
  • 131: 2c43207 = 131: f49a8d2 release: build unsigned Ubuntu .deb package
  • 132: b0c2fd7 = 132: d4cb43c release: add signing step for .deb package
  • 133: 1366e18 = 133: f2bf6d0 release: create draft GitHub release with packages & installers
  • 134: 0b6fb84 = 134: 392f5af build-git-installers: publish gpg public key
  • 135: 865e665 = 135: 432985a release: continue pestering until user upgrades
  • 136: 405bdeb = 136: 6c5ade5 dist: archive HEAD instead of HEAD^{tree}
  • 137: a0bf67e = 137: c663d2b release: include GIT_BUILT_FROM_COMMIT in MacOS build
  • 138: 3c315d9 = 138: 114d56b update-microsoft-git: create barebones builtin
  • 139: 275ae74 = 139: cc450ba release: add installer validation
  • 140: 7e1f097 = 140: 2b52fbf update-microsoft-git: Windows implementation
  • 141: 787ff62 = 141: 8108b8f update-microsoft-git: use brew on macOS
  • 142: 1b7d56d = 142: 630799e .github: reinstate ISSUE_TEMPLATE.md for microsoft/git
  • 144: 2762265 = 143: 76d846d git_config_set_multivar_in_file_gently(): add a lock timeout
  • 143: d2a58f2 = 144: 36ea383 .github: update PULL_REQUEST_TEMPLATE.md
  • 146: b8f49b5 = 145: 0b3e1dc scalar: set the config write-lock timeout to 150ms
  • 145: 12eb938 = 146: 8475a1a Adjust README.md for microsoft/git
  • 147: 9f69e39 = 147: b38dcaa scalar: add docs from microsoft/scalar
  • 148: 9897e52 = 148: 2501a2f scalar (Windows): use forward slashes as directory separators
  • 149: eb34810 = 149: 6aba9c6 scalar: add retry logic to run_git()
  • 150: ad91487 = 150: 506338d scalar: support the config command for backwards compatibility
  • 151: 9fcf9e9 = 151: 4aaf2c8 scalar: implement a minimal JSON parser
  • 152: 6c99c67 = 152: a518291 scalar clone: support GVFS-enabled remote repositories
  • 153: 4a5b50d = 153: dcfc26f test-gvfs-protocol: also serve smart protocol
  • 154: 45adb6a = 154: 1557a88 gvfs-helper: add the endpoint command
  • 155: 3999374 = 155: e9cf9fe dir_inside_of(): handle directory separators correctly
  • 156: 59b40f6 = 156: 5bc9660 scalar: disable authentication in unattended mode
  • 157: 1a3710e = 157: 8fa5c4b abspath: make strip_last_path_component() global
  • 158: 43db154 = 158: 58c18f0 scalar: do initialize gvfs.sharedCache
  • 159: a6c6966 = 159: 3594818 scalar diagnose: include shared cache info
  • 160: 192c391 = 160: c7d2788 scalar: only try GVFS protocol on https:// URLs
  • 161: e5e9d5b = 161: da1c21e scalar: verify that we can use a GVFS-enabled repository
  • 162: c88057d = 162: 33d848e scalar: add the cache-server command
  • 163: bc9ec85 = 163: b59e6e4 scalar: add a test toggle to skip accessing the vsts/info endpoint
  • 164: cff47a2 = 164: a364f97 scalar: adjust documentation to the microsoft/git fork
  • 165: 51a0743 = 165: 654295f scalar: enable untracked cache unconditionally
  • 166: a077b6f = 166: d1b851c scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility
  • 167: 26a1353 = 167: 85470de scalar: make GVFS Protocol a forced choice
  • 168: c8e52bf = 168: 35b500f scalar: work around GVFS Protocol HTTP/2 failures
  • 169: be82e76 = 169: 4efa8d3 gvfs-helper-client: clean up server process(es)
  • 170: 8f4b612 = 170: 79b5c9d scalar diagnose: accommodate Scalar's Functional Tests
  • 171: 6624b4b = 171: d28db13 ci: run Scalar's Functional Tests
  • 172: 9824395 = 172: fc66968 scalar: upgrade to newest FSMonitor config setting
  • 173: e94385b = 173: 38ad2ca add/rm: allow adding sparse entries when virtual
  • 174: 41ae7d0 = 174: 2585d17 sparse-checkout: add config to disable deleting dirs
  • 175: 3961e37 = 175: 85a1e85 diff: ignore sparse paths in diffstat
  • 176: bc2e121 = 176: a4f3726 repo-settings: enable sparse index by default
  • 177: 8e09f61 ! 177: b2d89d9 TO-UPSTREAM: sequencer: avoid progress when stderr is redirected
    @@ sequencer.c: static int do_recursive_merge(struct repository *r,
     -	o.show_rename_progress = 1;
     +	o.show_rename_progress = isatty(2);
      
    - 	head_tree = parse_tree_indirect(head);
    + 	head_tree = repo_parse_tree_indirect(the_repository, head);
      	if (!head_tree)
  • 178: 207def1 = 178: 5f089a6 TO-CHECK: t1092: use quiet mode for rebase tests
  • 179: 66adca6 = 179: f187773 reset: fix mixed reset when using virtual filesystem
  • 180: 556de36 = 180: 2221835 diff(sparse-index): verify with partially-sparse
  • 181: 9db988d = 181: f146197 stash: expand testing for git stash -u
  • 182: 4bbdc5e = 182: f63ec09 sparse-index: add ensure_full_index_with_reason()
  • 183: e0d2458 = 183: f099f88 treewide: add reasons for expanding index
  • 184: 6734b2c = 184: 3f3773d treewide: custom reasons for expanding index
  • 185: 88c1236 = 185: 7e36266 sparse-index: add macro for unaudited expansions
  • 186: 76b1c48 = 186: 6191124 Docs: update sparse index plan with logging
  • 187: cde3b13 = 187: af75845 sparse-index: log failure to clear skip-worktree
  • 188: cbff497 = 188: 3884e23 stash: use -f in checkout-index child process
  • 189: 9d1654d = 189: 5e08810 sparse-index: do not copy hashtables during expansion
  • 190: 97876d3 = 190: 3411953 TO-UPSTREAM: sub-process: avoid leaking cmd
  • 191: a3ac664 = 191: be27b55 remote-curl: release filter options before re-setting them
  • 192: 95de466 = 192: e3faca6 transport: release object filter options
  • 193: 87ff32a = 193: 669d7bb push: don't reuse deltas with path walk
  • 194: 1fd6375 = 194: 95626c2 t7900-maintenance.sh: reset config between tests
  • 195: 0629777 = 195: 738235d maintenance: add cache-local-objects maintenance task
  • 196: 1e7b49f = 196: 5de8f7c scalar.c: add cache-local-objects task
  • 197: 5be6f01 = 197: cf85069 hooks: add custom post-command hook config
  • 198: 0a84e2b = 198: 2e84a0d TO-UPSTREAM: Docs: fix asciidoc failures from short delimiters
  • 199: d58d4b5 = 199: 6d67873 hooks: make hook logic memory-leak free
  • 200: b5f8080 = 200: 709140b t0401: test post-command for alias, version, typo
  • 202: d477c4b = 201: 9e80003 hooks: better handle config without gitdir
  • 203: ca9756f = 202: 483b184 revision: defensive programming
  • 204: 65f1cf6 = 203: a57d447 get_parent(): defensive programming
  • 201: 82d241f = 204: e912d6b cat_one_file(): make it easy to see that the size variable is initialized
  • 205: 3026e9b = 205: 5ccc3cf fetch-pack: defensive programming
  • 208: ad739a1 = 206: 09d3fc2 fsck: avoid using an uninitialized variable
  • 206: f02ee5a = 207: efec9ef unparse_commit(): defensive programming
  • 210: 92cf8a5 = 208: 3f37fcd load_revindex_from_disk(): avoid accessing uninitialized data
  • 207: 84e8b76 = 209: 5f361b2 verify_commit_graph(): defensive programming
  • 209: 0d6f0c7 < -: ------------ stash: defensive programming
  • 212: ca0de06 = 210: 238a4e4 load_pack_mtimes_file(): avoid accessing uninitialized data
  • -: ------------ > 211: 8be04cc stash: defensive programming
  • 211: 6cc92f4 = 212: b3505d2 stash: defensive programming
  • 213: 9a58371 = 213: cb4acd4 fetch: silence a CodeQL alert about a local variable's address' use after release
  • 214: 2c85b84 = 214: f3e3f90 push: defensive programming
  • 215: 4bd9030 = 215: 8e32166 test-tool repository: check return value of lookup_commit()
  • 216: 43e1429 = 216: 0fe4bb0 fetch: defensive programming
  • 217: 11976bb = 217: 07aecb8 shallow: handle missing shallow commits gracefully
  • 219: cdbd1ee = 218: bd178dd inherit_tracking(): defensive programming
  • 220: c4ca44c = 219: e372b99 commit-graph: suppress warning about using a stale stack addresses
  • 218: add1566 = 220: 2cf4f63 codeql: run static analysis as part of CI builds
  • 221: f34b7fa = 221: 1331123 codeql: publish the sarif file as build artifact
  • 222: d63fd44 = 222: 9ebb7a9 codeql: disable a couple of non-critical queries for now
  • 223: 2308414 = 223: 0ff3a58 date: help CodeQL understand that there are no leap-year issues here
  • 224: 9851cbd = 224: 4f89b2e help: help CodeQL understand that consuming envvars is okay here
  • 225: 89a5590 = 225: d496770 ctype: help CodeQL understand that sane_istest() does not access array past end
  • 226: 9526a15 = 226: b29df46 ctype: accommodate for CodeQL misinterpreting the z in mallocz()
  • 227: faace42 = 227: c8d2435 strbuf_read: help with CodeQL misunderstanding that strbuf_read() does NUL-terminate correctly
  • 228: 6ad26c7 = 228: 5b8adbb codeql: also check JavaScript code
  • 229: 599632a = 229: 8124d81 scalar: add run_git_argv
  • 230: b29bcf8 = 230: efadafd scalar: add --ref-format option to scalar clone
  • 231: d8f2e7e = 231: 55e099a gvfs-helper: skip collision check for loose objects
  • 232: de5c5fb = 232: 9cfde1b gvfs-helper: emit advice on transient errors
  • 233: a4ee718 = 233: 7667f5b gvfs-helper: avoid collision check for packfiles
  • 234: 3200ce8 = 234: d283e10 t5799: update cache-server methods for multiple instances
  • 235: 52881b2 = 235: ab32e6b gvfs-helper: override cache server for prefetch
  • 236: 09b14ff = 236: 63bcfa8 gvfs-helper: override cache server for get
  • 237: a22cf14 = 237: 5cef3e7 gvfs-helper: override cache server for post
  • 238: cc86e69 = 238: ea2de83 t5799: add test for all verb-specific cache-servers together
  • 239: 5c6f94f = 239: 8587d22 lib-gvfs-helper: create helper script for protocol tests
  • 240: 11bf6f5 = 240: 26bae0e t579*: split t5799 into several parts
  • 241: 60b57e7 = 241: e7d356e fixup! survey: show some commits/trees/blobs histograms
  • 242: 1a4158b = 242: 0806908 fixup! gvfs-helper: create tool to fetch objects using the GVFS Protocol
  • 243: 4dbb468 = 243: aca4543 fixup! gvfs-helper: create tool to fetch objects using the GVFS Protocol
  • 244: 7fa24ee = 244: 1e62bbc fixup! release: add Mac OSX installer build
  • 245: df62761 = 245: 8b6ecf8 osxkeychain: always apply required build flags
  • 246: c518f83 = 246: 1443abd fixup! release: add Mac OSX installer build
  • 247: f3a3f05 < -: ------------ GIT-VERSION: fix forgotten -rc0

benpeart and others added 30 commits January 30, 2026 13:42
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 <benpeart@microsoft.com>
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 <mjcheetham@outlook.com>
…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 <johannes.schindelin@gmx.de>
Signed-off-by: Ben Peart <Ben.Peart@microsoft.com>
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 <mjcheetham@outlook.com>
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.
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 <mjcheetham@outlook.com>
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 <mjcheetham@outlook.com>
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 <jeffhost@microsoft.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
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 <jeffhost@microsoft.com>
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 <jeffhost@microsoft.com>
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 <jeffhost@microsoft.com>
Teach `git status --deserialize` to either wait indefintely
or immediately fail if the status serialization cache file
is stale.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
When using a virtual file system layer, the FSMonitor does not make
sense.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
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 <jeffhost@microsoft.com>
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 <jeffhostetler@github.com>
Add trace2 region around read_object_process to collect
time spent waiting for missing objects to be dynamically
fetched.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Add trace2 region and data events describing attempts to deserialize
status data using a status cache.

A category:status, label:deserialize region is pushed around the
deserialize code.

Deserialization results when reading from a file are:
    category:status, path   = <path>
    category:status, polled = <number_of_attempts>
    category:status, result = "ok" | "reject"

When reading from STDIN are:
    category:status, path   = "STDIN"
    category:status, result = "ok" | "reject"

Status will fallback and run a normal status scan when a "reject"
is reported (unless "--deserialize-wait=fail").

If "ok" is reported, status was able to use the status cache and
avoid scanning the workdir.

Additionally, a cmd_mode is emitted for each step: collection,
deserialization, and serialization.  For example, if deserialization
is attempted and fails and status falls back to actually computing
the status, a cmd_mode message containing "deserialize" is issued
and then a cmd_mode for "collect" is issued.

Also, if deserialization fails, a data message containing the
rejection reason is emitted.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Add trace information around status serialization.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
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 <Kevin.Willford@microsoft.com>
Report virtual filesystem summary data.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
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 <Kevin.Willford@microsoft.com>
Create trace2_initialize_clock() and call from main() to capture
process start time in isolation and before other sub-systems are
ready.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
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 <jeffhost@microsoft.com>
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Verify that `git status --deserialize=x -v` does not crash and
generates the same output as a normal (scanning) status command.

These issues are described in the previous 2 commits.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Teach Git to not throw a fatal error when an explicitly-specified
status-cache file (`git status --deserialize=<foo>`) could not be
found or opened for reading and silently fallback to a traditional
scan.

This matches the behavior when the status-cache file is implicitly
given via a config setting.

Note: the current version causes a test to start failing. Mark this as
an expected result for now.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Add trace2_thread_start() and trace2_thread_exit() events to the worker
threads used to read the index.  This gives per-thread perf data.

These workers were introduced in:
abb4bb8 read-cache: load cache extensions on a worker thread
77ff112 read-cache: load cache entries on worker threads

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
derrickstolee and others added 8 commits January 30, 2026 13:43
…or-windows#836)

I'm exploring ideas around a new cache-server infrastructure. One of the
trickiest parts of deploying new infrastructure is the need to have all
endpoints ready to go at launch without incremental learning.

This change adds new `gvfs.<verb>.cache-server` config keys that allow
for verb-by-verb overrides of the typical `gvfs.cache-server` config
key. These are loaded on a per-verb basis and then reset after the
request. Further, if there is a failure then the request is retried with
the base cache-server URL.

This would allow us to, for example, deploy a service that serves only
the `gvfs/prefetch` endpoint and see if that is improving on latency and
throughput expectations before moving on to the GET and POST verbs for
single and batched object downloads.

As I was adding tests, I realized that we should split this test script
into distinct parts so we can have a faster inner loop when testing
specific areas. I know that this script is frequently the longest script
running in our PR and CI builds, so the parallel split should help
significantly.

Use commit-by-commit review. I tried to keep the last two commits as
obviously "copy-and-paste only" except for a small change to the port
calculation to avoid overlap when using multiple ports in parallel
tests.

* [X] This change only applies to interactions with Azure DevOps and the
      GVFS Protocol.
The `OI_DBCACHED` flag was removed in 7a4bd1b (packfile: always
declare object info to be OI_PACKED, 2026-01-12). The commit message
suggests to use the `is_delta` flag instead, but that is only
populated if `OBJECT_INFO_QUICK` isn't passed (which is part of
`OBJECT_INFO_FOR_PREFETCH`, which we use here).

At the same time, no caller ever looked at the `cnt_dbcached` count. So
let's just remove it.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This is needed because of 84f0e60 (packfile: move packfile store
into object source, 2026-01-09).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
The v2.53.0-rc0.vfs.0.0 build began failing with:

    Undefined symbols for architecture arm64:
      "_iconv", referenced from:
          __libintl_find_msg in libintl.a[arm64][13](dcigettext.o)
      "_iconv_open", referenced from:
          __libintl_find_msg in libintl.a[arm64][13](dcigettext.o)
    ld: symbol(s) not found for architecture arm64

See https://github.com/microsoft/git/actions/runs/21450597958 for the
failing run. The previous release v2.52.0.vfs.0.5 built successfully on
January 24, 2026 (https://github.com/microsoft/git/actions/runs/21313971421).

The root cause is upstream commit cee341e ("macOS: use iconv from
Homebrew if needed and present", 2025-12-24), which was included in Git
v2.53.0-rc0 to work around an iconv bug in macOS 15.7.2. That commit
introduced USE_HOMEBREW_LIBICONV, which config.mak.uname now sets on
Darwin 24+, causing the Makefile to add Homebrew's libiconv to the
linker search path.

The problem is a symbol name mismatch: Homebrew's libiconv exports
symbols with a prefix (_libiconv, _libiconv_open) to avoid conflicting
with the system library, but Homebrew's gettext/libintl was built
against the system iconv which uses unprefixed symbols (_iconv,
_iconv_open). When building universal binaries, the linker finds
Homebrew's libiconv first and cannot resolve the symbols libintl needs.

The fix is to explicitly unset USE_HOMEBREW_LIBICONV and ICONVDIR in
config.mak, forcing the linker to use the system's /usr/lib/libiconv.dylib
which is already universal and exports the correct unprefixed symbols.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Starting with upstream commit 4580bcd ("osxkeychain: avoid
incorrectly skipping store operation", 2025-11-14), the osxkeychain
credential helper includes git-compat-util.h and links against
libgit.a.

The osxkeychain Makefile has:

    CFLAGS ?= -g -O2 -Wall -I../../.. $(BASIC_CFLAGS)

The ?= operator means "set only if not already set". When building
via a parent Makefile that passes CFLAGS on the command line, this
entire assignment is ignored - including the -I../../.. needed to find
git-compat-util.h and the $(BASIC_CFLAGS) needed for -DNO_OPENSSL:

    git-credential-osxkeychain.c:5:10: fatal error:
        'git-compat-util.h' file not found

Using += instead of ?= is not sufficient either, because command-line
variables in Make override even += assignments. We need to use
"override CFLAGS +=" to force these flags to be appended regardless
of how CFLAGS was set.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Starting with upstream commit 4580bcd ("osxkeychain: avoid
incorrectly skipping store operation", 2025-11-14), the osxkeychain
credential helper includes git-compat-util.h. That header includes
openssl/ssl.h unless -DNO_OPENSSL is defined:

    ../../../git-compat-util.h:199:10: fatal error:
        'openssl/ssl.h' file not found

On macOS, the main Makefile sets NO_OPENSSL (because Apple Common
Crypto is used instead) and adds -DNO_OPENSSL to BASIC_CFLAGS. But
contrib Makefiles that only include config.mak* files don't get this
logic - they only see the variables, not the Makefile rules that
convert NO_OPENSSL into -DNO_OPENSSL.

Add -DNO_OPENSSL to BASIC_CFLAGS in config.mak so that contrib builds
like osxkeychain can pick it up.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
The previous fixup for 84f0e60 (packfile: move packfile store
into object source, 2026-01-09) was incorrect.

That upstream commit moved the packfile store from being a single
global store in `struct object_database` to being per-source in
`struct odb_source`. The previous fixup adapted the
`packfile_store_reprepare()` call by changing:

    the_repository->objects->packfiles

to:

    the_repository->objects->sources->packfiles

However, this only reprepares the packfile store of the *first*
source in the linked list. This is incorrect because GVFS-helper
writes downloaded objects to `gh_client__chosen_odb`, which is
typically the shared cache alternate (configured via
`gvfs.sharedCache`), not the primary .git/objects directory.

When objects are downloaded into the shared cache but only the
primary source's packfile store is reprepared, the newly created
packfiles remain invisible to subsequent object lookups. This causes
the object lookup code in odb.c to fall through to the expensive
`gh_client__get_immediate()` path, re-fetching objects that were
already successfully downloaded via the batched queue mechanism.

The test t5793.3 "integration: fully implicit: diff 2 commits"
caught this regression. It verifies that blob objects are fetched
via the efficient batched queue path (`gh_client__queue_oid`) and
NOT via the single-object immediate path (`gh_client__get_immediate`).
With the broken fixup, objects were being fetched twice: once via
the queue (correct), and then again via immediate fetch (incorrect)
because the packfile store for the shared cache was never reprepared.

Fix this by repreparing the packfile store of the actual chosen ODB
where objects are written:

    gh_client__chosen_odb->packfiles

This variable is guaranteed to be set before
`gh_client__objects__receive_response()` is called, since all
callers go through `gh_client__find_long_running_process()` which
calls `gh_client__choose_odb()` first.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This includes the fixes I had to make to get
https://github.com/microsoft/git/releases/tag/v2.53.0-rc0.vfs.0.0 to
build, plus a fix for an overlooked stale `GIT-VERSION-GEN`,
@dscho
Copy link
Member Author

dscho commented Jan 30, 2026

  • 209: 0d6f0c7 < -: ------------ stash: defensive programming
  • -: ------------ > 211: 8be04cc stash: defensive programming

This should have been:

Range-diff
  • 1: 0d6f0c7 ! 1: 8be04cc stash: defensive programming

    @@ builtin/stash.c
     @@ builtin/stash.c: static int reset_tree(struct object_id *i_tree, int update, int reset)
      	memset(&opts, 0, sizeof(opts));
      
    - 	tree = parse_tree_indirect(i_tree);
    --	if (parse_tree(tree))
    -+	if (!tree || parse_tree(tree))
    + 	tree = repo_parse_tree_indirect(the_repository, i_tree);
    +-	if (repo_parse_tree(the_repository, tree))
    ++	if (!tree || repo_parse_tree(the_repository, tree))
      		return -1;
      
      	init_tree_desc(t, &tree->object.oid, tree->buffer, tree->size);

@dscho dscho marked this pull request as draft January 30, 2026 13:14
@dscho dscho self-assigned this Jan 30, 2026
This is now required due to `rs/tree-wo-the-repository`, specifically
ec7a16b (cocci: convert parse_tree functions to repo_ variants,
2026-01-09).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
@dscho dscho marked this pull request as ready for review January 30, 2026 15:39
@dscho dscho merged commit 2cef3d6 into microsoft:vfs-2.53.0-rc2 Jan 31, 2026
66 checks passed
@dscho dscho deleted the tentative/vfs-2.53.0-rc2 branch January 31, 2026 12:25
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.