Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rebase to v2.48.0-rc0 #5315

Merged
merged 920 commits into from
Dec 17, 2024

Conversation

dscho
Copy link
Member

@dscho dscho commented Dec 16, 2024

Range-diff relative to main
  • 1: 5c8cfb9 = 1: f27e894 t9350: point out that refs are not updated correctly

  • 2: bb78dfd = 2: 6291a9c transport-helper: add trailing --

  • 5: e2e116a = 3: 246d452 gitk(Windows): avoid inadvertently calling executables in the worktree

  • 8: 28669ef = 4: 928b74b mingw: include the Python parts in the build

  • 11: d3370a9 = 5: e2d63e5 win32/pthread: avoid name clashes with winpthread

  • 3: 40bbb20 = 6: 972a8ce remote-helper: check helper status after import/export

  • 4: c1365f1 = 7: 9283464 mingw: demonstrate a problem with certain absolute paths

  • 7: e357054 = 8: 9daf220 clean: do not traverse mount points

  • 12: 6bddbec = 9: 850335d git-compat-util: avoid redeclaring _DEFAULT_SOURCE

  • 6: 0ffc708 = 10: cc54629 Always auto-gc after calling a fast-import transport

  • 9: a453ea2 = 11: abbe69b mingw: allow absolute paths without drive prefix

  • 10: 7d1ae8f = 12: 4249561 clean: remove mount points when possible

  • 13: 4725915 = 13: bead1b4 Import the source code of mimalloc v2.1.2

  • 14: 9e370d8 = 14: 2e49e8e mimalloc: adjust for building inside Git

  • 15: a4ec08c = 15: 3f61f35 mimalloc: offer a build-time option to enable it

  • 16: 2c9b986 = 16: 2df9f24 mimalloc: use "weak" random seed when statically linked

  • 17: 7ab713d = 17: f5dee0a mingw: use mimalloc

  • 18: a8e5535 = 18: f1ed354 transport: optionally disable side-band-64k

  • 19: f3916a0 = 19: bb909a6 mingw: make sure errno is set correctly when socket operations fail

  • 22: 3b63062 = 20: 5069cbb mingw: do resolve symlinks in getcwd()

  • 23: d898328 = 21: 7877c44 mingw: fix fatal error working on mapped network drives on Windows

  • 24: cb062b1 = 22: 26ef7f2 clink.pl: fix MSVC compile script to handle libcurl-d.lib

  • 25: 456ac58 = 23: 02fd6ac mingw: ensure valid CTYPE

  • 20: 53bd507 = 24: 051ad0c mingw: demonstrate a git add issue with NTFS junctions

  • 26: e803c66 = 25: cbda9e7 mingw: allow git.exe to be used instead of the "Git wrapper"

  • 21: a93211c = 26: 666ddb0 strbuf_realpath(): use platform-dependent API if available

  • 27: 31c97b6 = 27: b410471 mingw: ignore HOMEDRIVE/HOMEPATH if it points to Windows' system directory

  • 29: 05eb5f5 = 28: 464879f mingw: implement a platform-specific strbuf_realpath()

  • 28: 2c50312 ! 29: a62c776 http: use new "best effort" strategy for Secure Channel revoke checking

    @@ http.c: static CURL *get_curl_handle(void)
      
      	if (http_ssl_backend && !strcmp("schannel", http_ssl_backend) &&
     -	    !http_schannel_check_revoke) {
    -+	    http_schannel_check_revoke_mode) {
    - #ifdef GIT_CURL_HAVE_CURLSSLOPT_NO_REVOKE
     -		curl_easy_setopt(result, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
    ++	    http_schannel_check_revoke_mode) {
     +		curl_easy_setopt(result, CURLOPT_SSL_OPTIONS, http_schannel_check_revoke_mode);
    - #else
    - 		warning(_("CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"));
    - #endif
    + 	}
    + 
    + 	if (http_proactive_auth != PROACTIVE_AUTH_NONE)
  • 30: 23f2d87 = 30: de8e303 vcxproj: unclash project directories with build outputs

  • 31: d55b1b6 = 31: 6995f48 t5505/t5516: allow running without .git/branches/ in the templates

  • 32: b80c258 = 32: 4860eaa t5505/t5516: fix white-space around redirectors

  • 33: d276393 = 33: 303c42b t3701: verify that we can add lots of files interactively

  • 34: 8f35920 = 34: 2a12948 git add -i: handle CR/LF line endings in the interactive input

  • 35: bf7b3b6 = 35: 47a4dc2 commit: accept "scissors" with CR/LF line endings

  • 36: a9bc204 = 36: 7068e74 t0014: fix indentation

  • 38: 7f30b78 = 37: adbffc0 clink.pl: fix libexpatd.lib link error when using MSVC

  • 39: 9dc2022 = 38: 5ebaabe Makefile: clean up .ilk files when MSVC=1

  • 37: a5c5c3d = 39: 9cfb8af git-gui: accommodate for intent-to-add files

  • 40: 12df0b7 = 40: 3786942 vcbuild: add support for compiling Windows resource files

  • 41: bbc6fe8 = 41: def6b2c config.mak.uname: add git.rc to MSVC builds

  • 42: 91c70e8 = 42: 9855a1a clink.pl: ignore no-stack-protector arg on MSVC=1 builds

  • 43: 96b8bc9 = 43: 1be2e98 clink.pl: move default linker options for MSVC=1 builds

  • 44: c8c4463 = 44: adb6516 buildsystems: remove duplicate clause

  • 45: 9303fcb = 45: 0ce0360 vcxproj: handle resource files, too

  • 46: b1ad8e8 = 46: cd4fa54 vcxproj: ignore -fno-stack-protector and -fno-common

  • 47: 1919480 = 47: 47e926f vcxproj: handle GUI programs, too

  • 48: 8b62f2e = 48: 48d634b cmake: install headless-git.

  • 49: f321ca9 = 49: 767ea7a vcpkg_install: detect lack of Git

  • 50: f315aff = 50: 797b057 vcpkg_install: add comment regarding slow network connections

  • 51: c3e7756 = 51: 7a890c8 vcxproj: support building Windows/ARM64 binaries

  • 52: 19d30f7 = 52: c6e7e04 vcbuild: install ARM64 dependencies when building ARM64 binaries

  • 53: fe49458 = 53: 42a4de8 vcbuild: add an option to install individual 'features'

  • 54: 7ec0269 ! 54: b5253ed cmake: allow building for Windows/ARM64

    @@ contrib/buildsystems/CMakeLists.txt: if(USE_VCPKG)
      
      	# In the vcpkg edition, we need this to be able to link to libcurl
      	set(CURL_NO_CURL_CMAKE ON)
    -@@ contrib/buildsystems/CMakeLists.txt: file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "RUNTIME_PREFIX='${RUNTIME_PRE
    - file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PYTHON='${NO_PYTHON}'\n")
    - file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "SUPPORTS_SIMPLE_IPC='${SUPPORTS_SIMPLE_IPC}'\n")
    +@@ contrib/buildsystems/CMakeLists.txt: string(REPLACE "@USE_GETTEXT_SCHEME@" "" git_build_options "${git_build_options}
    + string(REPLACE "@LOCALEDIR@" "'${LOCALEDIR}'" git_build_options "${git_build_options}")
    + string(REPLACE "@BROKEN_PATH_FIX@" "" git_build_options "${git_build_options}")
      if(USE_VCPKG)
    --	file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/x64-windows/bin\"\n")
    -+	file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/${VCPKG_ARCH}/bin\"\n")
    +-	string(APPEND git_build_options "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/x64-windows/bin\"\n")
    ++	string(APPEND git_build_options "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/${VCPKG_ARCH}/bin\"\n")
      endif()
    + file(WRITE ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS ${git_build_options})
      
    - #Make the tests work when building out of the source tree
  • 55: fea6ee3 = 55: 3fe9617 ci(vs-build) also build Windows/ARM64 artifacts

  • 56: 3b37c55 = 56: 7229e6b Add schannel to curl installation

  • 57: d006d65 = 57: b08ceed cmake(): allow setting HOST_CPU for cross-compilation

  • 58: fd76ce1 ! 58: 3605e9e mingw: allow for longer paths in parse_interpreter()

    @@ compat/mingw.c: static const char *quote_arg_msys2(const char *arg)
     -	static char buf[100];
     +	static char buf[MAX_PATH];
      	char *p, *opt;
    - 	int n, fd;
    - 
    + 	ssize_t n; /* read() can return negative values */
    + 	int fd;
  • 59: 21de89c = 59: 80f8927 compat/vcbuild: document preferred way to build in Visual Studio

  • 60: 93d79ee ! 60: eb5a4c2 http: optionally send SSL client certificate

    @@ http.c: static CURL *get_curl_handle(void)
      
     -	if (http_ssl_backend && !strcmp("schannel", http_ssl_backend) &&
     -	    http_schannel_check_revoke_mode) {
    +-		curl_easy_setopt(result, CURLOPT_SSL_OPTIONS, http_schannel_check_revoke_mode);
     +	if (http_ssl_backend && !strcmp("schannel", http_ssl_backend)) {
     +		long ssl_options = 0;
     +		if (http_schannel_check_revoke_mode) {
    - #ifdef GIT_CURL_HAVE_CURLSSLOPT_NO_REVOKE
    --		curl_easy_setopt(result, CURLOPT_SSL_OPTIONS, http_schannel_check_revoke_mode);
     +			ssl_options |= http_schannel_check_revoke_mode;
    - #else
    --		warning(_("CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"));
    -+			warning(_("CURLSSLOPT_NO_REVOKE not supported with cURL < 7.44.0"));
    - #endif
     +		}
     +
     +		if (http_auto_client_cert) {
  • 63: 583f668 = 61: 8d08b04 CMake: default Visual Studio generator has changed

  • 61: c0c98a5 = 62: c6617dc subtree: update contrib/subtree test target

  • 64: 63debc5 = 63: 243de9a .gitignore: add Visual Studio CMakeSetting.json file

  • 62: d537e6c = 64: 93cc63e ci: run contrib/subtree tests in CI builds

  • 67: 591478a = 65: be7a83b hash-object: demonstrate a >4GB/LLP64 problem

  • 68: 9623c9d = 66: 5e385ee write_object_file_literally(): use size_t

  • 69: 4d26723 = 67: 7763825 object-file.c: use size_t for header lengths

  • 70: 8839e60 = 68: c40cce2 hash algorithms: use size_t for section lengths

  • 72: eb630eb = 69: 0266868 hash-object --stdin: verify that it works with >4GB/LLP64

  • 65: 66e8e3e = 70: a4f9942 CMakeLists: add default "x64-windows" arch for Visual Studio

  • 73: 5dfb2a2 = 71: 04f3f52 hash-object: add another >4GB/LLP64 test case

  • 75: 58ab53f = 72: 393cd05 setup: properly use "%(prefix)/" when in WSL

  • 66: 2047422 = 73: 007aa44 CMake: show Win32 and Generator_platform build-option values

  • 71: 8ab656d = 74: fdb6e11 init: do parse all core.* settings early

  • 74: 6634ac1 = 75: e876d15 hash-object: add a >4GB/LLP64 test case using filtered input

  • 76: 59250a0 = 76: 4f50a50 compat/mingw.c: do not warn when failing to get owner

  • 81: b750a5f = 77: 8523711 vcxproj: allow building with NO_PERL again

  • 82: c68eb37 = 78: 4163c01 vcxproj: require C11

  • 83: 81e7c62 = 79: 2abe6f3 vcxproj: ignore the -pedantic option

  • 84: b7ed7c5 = 80: 53fcfbb vcxproj: include reftable when committing .vcxproj files

  • 85: e22fc0b = 81: 80291a1 vcxproj: handle libreftable_test, too

  • 86: 1c3a6f9 = 82: f75ac66 vcxproj: avoid escaping double quotes in the defines

  • 78: dc3d458 ! 83: 3b721e8 Add config option windows.appendAtomically

    @@ compat/mingw.c: int mingw_open (const char *filename, int oflags, ...)
     +	if (append_atomically && (oflags & O_APPEND) &&
     +		!is_local_named_pipe_path(filename))
      		open_fn = mingw_open_append;
    - 	else
    - 		open_fn = _wopen;
    + 	else if (!(oflags & ~(O_ACCMODE | O_NOINHERIT)))
    + 		open_fn = mingw_open_existing;
     @@ compat/mingw.c: ssize_t mingw_write(int fd, const void *buf, size_t len)
      
      		/* check if fd is a pipe */
  • 87: 0f55e74 = 84: 60f3569 ci: adjust Azure Pipeline for runs_on_pool

  • 77: 7c4ff36 = 85: c0b742a mingw: $env:TERM="xterm-256color" for newer OSes

  • 79: 1ddc09b = 86: c2c7e03 winansi: check result and Buffer before using Name

  • 80: c9315d9 = 87: 2423212 mingw: change core.fsyncObjectFiles = 1 by default

  • 88: c4c7782 = 88: f7fcdfe ci: stop linking the prove cache

  • 89: 1c42d58 = 89: 6678438 ci: reinstate Azure Pipelines support

  • 90: 4bf5031 = 90: 96657e2 azure-pipeline: drop the GETTEXT_POISON job

  • 91: b4c9d13 = 91: a9af8be azure-pipeline: stop hard-coding apt-get calls

  • 92: 9939a9f = 92: 5cd8498 azure-pipeline: drop the code to write to/read from a file share

  • 93: 224e010 = 93: e1bd570 azure-pipeline: use partial clone/parallel checkout to initialize minimal-sdk

  • 94: 6a84be4 = 94: 60670ba azure-pipeline: downcase the job name of the Linux32 job

  • 98: 0260c4c = 95: 77ded97 MinGW: link as terminal server aware

  • 95: 41f82a8 = 96: c879d01 azure-pipeline: run static-analysis on jammy

  • 99: f722e2a ! 97: 1acf162 Fix Windows version resources

    @@ Commit message
     
         Signed-off-by: Kiel Hurley <kielhurley@gmail.com>
     
    - ## git.rc ##
    -@@ git.rc: BEGIN
    + ## git.rc.in ##
    +@@ git.rc.in: BEGIN
            VALUE "OriginalFilename", "git.exe\0"
            VALUE "ProductName", "Git\0"
    -       VALUE "ProductVersion", GIT_VERSION "\0"
    -+      VALUE "FileVersion", GIT_VERSION "\0"
    +       VALUE "ProductVersion", "@GIT_VERSION@\0"
    ++      VALUE "FileVersion", "@GIT_VERSION@\0"
          END
        END
      
  • 96: ab7ef94 = 98: a98bbf6 bswap.h: add support for built-in bswap functions

  • 97: 02be695 = 99: 3c78990 config.mak.uname: add support for clangarm64

  • 100: c2361f8 = 100: e351ec8 ci: create clangarm64-build.yml

  • 104: 2ca159e = 101: 7e9e7db http: optionally load libcurl lazily

  • 105: 4bfc6a0 = 102: b8bf94e http: support lazy-loading libcurl also on Windows

  • 106: 58317a8 = 103: 341c532 http: when loading libcurl lazily, allow for multiple SSL backends

  • 101: 74740a3 = 104: 1f5d6b2 status: fix for old-style submodules with commondir

  • 102: a1a82fc = 105: b3573d0 windows: skip linking git-<command> for built-ins

  • 103: d31ff6c = 106: ef57b5e windows: fix Repository>Explore Working Copy

  • 107: 2cfe8fc = 107: 7347c83 mingw: do load libcurl dynamically by default

  • 108: 70a07b0 = 108: 5792917 Add a GitHub workflow to verify that Git/Scalar work in Nano Server

  • 109: 513b13e = 109: b367f70 mingw: suggest windows.appendAtomically in more cases

  • 110: 9e28d96 = 110: e79fd76 win32: use native ANSI sequence processing, if possible

  • 117: 37c7e21 = 111: 793e990 ci: work around a problem with HTTP/2 vs libcurl v8.10.0

  • 111: 729ed48 ! 112: ba44977 git.rc: include winuser.h

    @@ contrib/buildsystems/Generators/Vcxproj.pm: sub createProject {
          </Link>
      EOM
     
    - ## git.rc ##
    + ## git.rc.in ##
     @@
     +#include<winuser.h>
      1 VERSIONINFO
    - FILEVERSION     MAJOR,MINOR,MICRO,PATCHLEVEL
    - PRODUCTVERSION  MAJOR,MINOR,MICRO,PATCHLEVEL
    + FILEVERSION     @GIT_MAJOR_VERSION@,@GIT_MINOR_VERSION@,@GIT_MICRO_VERSION@,@GIT_PATCH_LEVEL@
    + PRODUCTVERSION  @GIT_MAJOR_VERSION@,@GIT_MINOR_VERSION@,@GIT_MICRO_VERSION@,@GIT_PATCH_LEVEL@
  • 112: 910d494 = 113: 43041db common-main.c: fflush stdout buffer upon exit

  • 113: 5d2bfee ! 114: a657db8 t5601/t7406(mingw): do run tests with symlink support

    @@ t/t5601-clone.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
     
      ## t/t7406-submodule-update.sh ##
     @@ t/t7406-submodule-update.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
    - TEST_PASSES_SANITIZE_LEAK=true
    + 
      . ./test-lib.sh
      
     +# This test script contains test cases that need to create symbolic links. To
  • 114: 262bebd = 115: 803664a win32: ensure that localtime_r() is declared even in i686 builds

  • 115: d6606cb = 116: facad06 Fallback to AppData if XDG_CONFIG_HOME is unset

  • 116: 97819f5 = 117: c084e11 run-command: be helpful with Git LFS fails on Windows 7

  • 118: 6489746 = 118: 45712e6 pack-objects: add --full-name-hash option

  • 119: 0400635 = 119: 8c1ada6 repack: test --full-name-hash option

  • 120: 32fbc51 = 120: 1b4cbdd pack-objects: add GIT_TEST_FULL_NAME_HASH

  • 121: 5ec06b8 = 121: 97ac379 git-repack: update usage to match docs

  • 122: 93b5259 = 122: ff70b3e p5313: add size comparison test

  • 123: eb9f0d9 = 123: e9e1bd0 test-tool: add helper for name-hash values

  • 124: f5cf8e5 = 124: d7f370c repack/pack-objects: mark --full-name-hash as experimental

  • 125: 4abe739 = 125: dd1838d path-walk: introduce an object walk by path

  • 126: 483c73b = 126: 874b38a t6601: add helper for testing path-walk API

  • 127: efea267 = 127: 8f8c632 path-walk: allow consumer to specify object types

  • 128: 229cc68 = 128: 0fad4d9 path-walk: allow visiting tags

  • 129: 6b02e8c = 129: b56ca2b revision: create mark_trees_uninteresting_dense()

  • 130: 2bd12ae = 130: 610ef56 path-walk: add prune_all_uninteresting option

  • 131: 7b0b966 = 131: 6a9854f pack-objects: extract should_attempt_deltas()

  • 132: 4ae0c15 = 132: c6e586b pack-objects: add --path-walk option

  • 133: e9acce7 ! 133: 4f17399 pack-objects: introduce GIT_TEST_PACK_PATH_WALK

    @@ t/t5316-pack-delta-depth.sh: max_chain() {
      	test_cmp expect actual
     
      ## t/t5332-multi-pack-reuse.sh ##
    -@@ t/t5332-multi-pack-reuse.sh: TEST_PASSES_SANITIZE_LEAK=true
    +@@ t/t5332-multi-pack-reuse.sh: test_description='pack-objects multi-pack reuse'
      
      GIT_TEST_MULTI_PACK_INDEX=0
      GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL=0
  • 134: 4e6ac7c = 134: 0eb669a repack: add --path-walk option

  • 135: 6108ed4 = 135: b607fa3 pack-objects: enable --path-walk via config

  • 136: cb1b10c = 136: 1336a47 scalar: enable path-walk during push via config

  • 137: 11969a9 = 137: 5ef46ce pack-objects: refactor path-walk delta phase

  • 138: db77bb9 = 138: 8d4b48c pack-objects: thread the path-based compression

  • 139: 1df3d82 = 139: 5f654eb path-walk API: avoid adding a root tree more than once

  • 140: 2f56089 = 140: fe44261 backfill: add builtin boilerplate

  • 141: 976f964 = 141: 6b02fe5 backfill: basic functionality and tests

  • 142: d9013cb = 142: b4524dd backfill: add --batch-size= option

  • 143: 65ecbcd = 143: c87c850 backfill: add --sparse option

  • 144: ad0d10b = 144: ac21d0e backfill: assume --sparse when sparse-checkout is enabled

  • 145: f8f86c9 = 145: 53748c9 backfill: mark it as experimental

  • 146: b5b22c9 ! 146: cd3bad1 survey: stub in new experimental 'git-survey' command

    @@ Documentation/git-survey.txt (new)
     +SYNOPSIS
     +--------
     +[verse]
    -+(EXPERIMENTAL!) `git survey` <options>
    ++(EXPERIMENTAL!) 'git survey' <options>
     +
     +DESCRIPTION
     +-----------
  • 147: 5411a08 = 147: 3af26bf survey: add command line opts to select references

  • 148: a2f2b04 = 148: 83e545c survey: start pretty printing data in table form

  • 149: 47b2659 = 149: 4379037 survey: add object count summary

  • 150: 8a45402 = 150: 2e67557 survey: summarize total sizes by object type

  • 151: 22f09cd = 151: 5f8843d survey: show progress during object walk

  • 152: 0c887c3 = 152: 6652358 survey: add ability to track prioritized lists

  • 153: 3e1d3a4 = 153: 801907a survey: add report of "largest" paths

  • 154: bd2cc14 = 154: 2829bce survey: add --top= option and config

  • 155: 2050d48 = 155: ad946ea survey: clearly note the experimental nature in the output

  • 156: dee6e10 = 156: 54b6207 path-walk: improve path-walk speed with many tags

  • 157: 2b74f7c (upstream: ea34226) < -: ----------- Makefile: fix dependency for $(UNIT_TEST_DIR)/clar/clar.o

  • 158: ac0b0e8 (upstream: 386d372) < -: ----------- mingw.c: Fix complier warnings for a 64 bit msvc

  • 159: 3b31514 = 157: 67e1c3e Win32: make FILETIME conversion functions public

  • 160: 0916d98 = 158: 955b331 Win32: dirent.c: Move opendir down

  • 161: 078ca6f = 159: cbb36a9 mingw: make the dirent implementation pluggable

  • 162: 7a9d04d = 160: 2c594a6 Win32: make the lstat implementation pluggable

  • 163: b432ad2 = 161: 4ded0c7 mingw: add infrastructure for read-only file system level caches

  • 164: fe287c9 = 162: b977619 mingw: add a cache below mingw's lstat and dirent implementations

  • 165: 76af47d = 163: b694dd3 fscache: load directories only once

  • 166: fba27d9 = 164: 28a7dad fscache: add key for GIT_TRACE_FSCACHE

  • 167: 6c3fcc6 = 165: f4a91fe fscache: remember not-found directories

  • 168: 5334827 = 166: 3476dc9 fscache: add a test for the dir-not-found optimization

  • 169: 9a2ec4c = 167: 4b056df add: use preload-index and fscache for performance

  • 170: d376cd2 = 168: 02d3b8b dir.c: make add_excludes aware of fscache during status

  • 171: e7fb9d5 = 169: b561a4f fscache: make fscache_enabled() public

  • 172: b648f3d = 170: b0eff6c dir.c: regression fix for add_excludes with fscache

  • 173: 3ed426a = 171: bb65a96 fetch-pack.c: enable fscache for stats under .git/objects

  • 174: 9edc43b = 172: 3caf5fb checkout.c: enable fscache for checkout again

  • 175: ff7b5dc = 173: f82602b Enable the filesystem cache (fscache) in refresh_index().

  • 176: 0769498 = 174: bfa3fab fscache: use FindFirstFileExW to avoid retrieving the short name

  • 177: c03535e = 175: 3ddbf68 status: disable and free fscache at the end of the status command

  • 178: 9e9c053 = 176: edcf782 fscache: add GIT_TEST_FSCACHE support

  • 179: 43f88c4 = 177: ab4a727 fscache: add fscache hit statistics

  • 180: 514aa16 = 178: 7ba0696 mem_pool: add GIT_TRACE_MEMPOOL support

  • 181: 3e2f937 = 179: d612cd3 fscache: fscache takes an initial size

  • 182: c17cce8 = 180: 373c237 fscache: update fscache to be thread specific instead of global

  • 183: e19097e = 181: eeeb9ef fscache: teach fscache to use mempool

  • 184: d7cf33d = 182: ac06831 fscache: make fscache_enable() thread safe

  • 185: 8b23bf0 = 183: 3acef83 fscache: teach fscache to use NtQueryDirectoryFile

  • 186: fb8d206 = 184: ed6013d unpack-trees: enable fscache for sparse-checkout

  • 190: 2962efb = 185: 477f507 git-gui: provide question helper for retry fallback on Windows

  • 191: a4c23dc = 186: 0f55b53 git gui: set GIT_ASKPASS=git-gui--askpass if not set yet

  • 192: b1f11b8 = 187: 6d87ce9 git-gui--askyesno: fix funny text wrapping

  • 187: 2e024ab = 188: 9b4b52a fscache: remember the reparse tag for each entry

  • 194: d6f6e9b = 189: 030a786 git-gui--askyesno: allow overriding the window title

  • 188: 03343ed = 190: 37e0a25 fscache: implement an FSCache-aware is_mount_point()

  • 196: 0d4f495 = 191: 0103a67 git-gui--askyesno (mingw): use Git for Windows' icon, if available

  • 189: d9f7c48 = 192: 462d6fc clean: make use of FSCache

  • 193: 4685e5f = 193: 17e9a5f gitk: Unicode file name support

  • 195: 528786d = 194: d465cce gitk: Use an external icon file on Windows

  • 197: 74c8ff8 = 195: 72e5c65 gitk: fix arrow keys in input fields with Tcl/Tk >= 8.6

  • 198: 7726fb9 = 196: a581f71 gitk: make the "list references" default window width wider

  • 199: 0d214ce = 197: d770fa7 pack-objects (mingw): demonstrate a segmentation fault with large deltas

  • 200: e6f2707 ! 198: cc31a8d mingw: support long paths

    @@ compat/mingw.c: static pid_t mingw_spawnve_fd(const char *cmd, const char **argv
      		return -1;
      	if (dir && xutftowcs_path(wdir, dir) < 0)
     @@ compat/mingw.c: int mingw_rename(const char *pold, const char *pnew)
    - {
    + 	static int supports_file_rename_info_ex = 1;
      	DWORD attrs, gle;
      	int tries = 0;
     -	wchar_t wpold[MAX_PATH], wpnew[MAX_PATH];
    --	if (xutftowcs_path(wpold, pold) < 0 || xutftowcs_path(wpnew, pnew) < 0)
     +	wchar_t wpold[MAX_LONG_PATH], wpnew[MAX_LONG_PATH];
    -+	if (xutftowcs_long_path(wpold, pold) < 0 ||
    -+	    xutftowcs_long_path(wpnew, pnew) < 0)
    + 	int wpnew_len;
    + 
    +-	if (xutftowcs_path(wpold, pold) < 0)
    ++	if (xutftowcs_long_path(wpold, pold) < 0)
    + 		return -1;
    +-	wpnew_len = xutftowcs_path(wpnew, pnew);
    ++	wpnew_len = xutftowcs_long_path(wpnew, pnew);
    + 	if (wpnew_len < 0)
      		return -1;
      
    - 	/*
     @@ compat/mingw.c: int mingw_raise(int sig)
      
      int link(const char *oldpath, const char *newpath)
  • 201: ff963b4 ! 199: 8b1ae27 Win32: fix 'lstat("dir/")' with long paths

    @@ compat/mingw.c
     @@ compat/mingw.c: static int do_lstat(int follow, const char *file_name, struct stat *buf)
      static int do_stat_internal(int follow, const char *file_name, struct stat *buf)
      {
    - 	int namelen;
    + 	size_t namelen;
     -	char alt_name[PATH_MAX];
     +	char alt_name[MAX_LONG_PATH];
      
  • 202: e3ce232 = 200: c31f805 win32(long path support): leave drive-less absolute paths intact

  • 205: 69e60dd = 201: d9f328a mingw: Support git_terminal_prompt with more terminals

  • 206: 712ea9e = 202: 468e16b compat/terminal.c: only use the Windows console if bash 'read -r' fails

  • 207: b084059 = 203: 4f44351 mingw (git_terminal_prompt): do fall back to CONIN$/CONOUT$ method

  • 208: 5c4aa7d = 204: 6e9bf61 strbuf_readlink: don't call readlink twice if hint is the exact link size

  • 209: 47f46b2 = 205: 8794dfb strbuf_readlink: support link targets that exceed PATH_MAX

  • 210: c0d6f43 = 206: 2dd0de5 lockfile.c: use is_dir_sep() instead of hardcoded '/' checks

  • 211: 3cee87d ! 207: c255aff Win32: don't call GetFileAttributes twice in mingw_lstat()

    @@ compat/mingw.c: static int do_lstat(int follow, const char *file_name, struct st
     - */
     -static int do_stat_internal(int follow, const char *file_name, struct stat *buf)
     -{
    --	int namelen;
    +-	size_t namelen;
     -	char alt_name[MAX_LONG_PATH];
     -
     -	if (!do_lstat(follow, file_name, buf))
  • 203: a6f588e = 208: 71a00a4 compat/fsmonitor/fsm-*-win32: support long paths

  • 204: f418cfd = 209: 6baf71a clean: suggest using core.longPaths if paths are too long to remove

  • 212: 8c09f0b = 210: c1f4a9e Win32: implement stat() with symlink support

  • 213: cfbbe6d = 211: 4c2860e Win32: remove separate do_lstat() function

  • 214: 1adc244 = 212: 738f29f Win32: let mingw_lstat() error early upon problems with reparse points

  • 215: 052c593 = 213: 97def5a mingw: teach fscache and dirent about symlinks

  • 216: 16c30c4 = 214: f1bee41 Win32: lstat(): return adequate stat.st_size for symlinks

  • 217: d430fe6 = 215: 9017c16 Win32: factor out retry logic

  • 218: c153bde = 216: 7f8f1a8 Win32: change default of 'core.symlinks' to false

  • 219: f4d71dd = 217: 363502c Win32: add symlink-specific error codes

  • 220: 393164b = 218: 4c6b76e Win32: mingw_unlink: support symlinks to directories

  • 221: b140540 ! 219: 71cd243 Win32: mingw_rename: support renaming symlinks

    @@ Commit message
     
      ## compat/mingw.c ##
     @@ compat/mingw.c: int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz)
    - #undef rename
      int mingw_rename(const char *pold, const char *pnew)
      {
    + 	static int supports_file_rename_info_ex = 1;
     -	DWORD attrs, gle;
     +	DWORD attrs = INVALID_FILE_ATTRIBUTES, gle;
      	int tries = 0;
      	wchar_t wpold[MAX_LONG_PATH], wpnew[MAX_LONG_PATH];
    - 	if (xutftowcs_long_path(wpold, pold) < 0 ||
    - 	    xutftowcs_long_path(wpnew, pnew) < 0)
    + 	int wpnew_len;
    +@@ compat/mingw.c: int mingw_rename(const char *pold, const char *pnew)
    + 	if (wpnew_len < 0)
      		return -1;
      
     -	/*
    @@ compat/mingw.c: int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz
     -		return 0;
     -	if (errno != EEXIST)
     -		return -1;
    +-
      repeat:
    --	if (MoveFileExW(wpold, wpnew, MOVEFILE_REPLACE_EXISTING))
    -+	if (MoveFileExW(wpold, wpnew,
    -+			MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED))
    - 		return 0;
    + 	if (supports_file_rename_info_ex) {
    + 		/*
    +@@ compat/mingw.c: int mingw_rename(const char *pold, const char *pnew)
    + 		 * to retry.
    + 		 */
    + 	} else {
    +-		if (MoveFileExW(wpold, wpnew, MOVEFILE_REPLACE_EXISTING))
    ++		if (MoveFileExW(wpold, wpnew,
    ++				MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED))
    + 			return 0;
    + 		gle = GetLastError();
    + 	}
    + 
     -	/* TODO: translate more errors */
    - 	gle = GetLastError();
     -	if (gle == ERROR_ACCESS_DENIED &&
    -+
     +	/* revert file attributes on failure */
     +	if (attrs != INVALID_FILE_ATTRIBUTES)
     +		SetFileAttributesW(wpnew, attrs);
  • 222: a6b988f = 220: f20e0c0 Win32: mingw_chdir: change to symlink-resolved directory

  • 223: beccee0 = 221: 26cf10e Win32: implement readlink()

  • 224: 99d1d87 = 222: 56342ad mingw: lstat: compute correct size for symlinks

  • 225: 78ba988 = 223: 74e783a Win32: implement basic symlink() functionality (file symlinks only)

  • 226: 6c4ce32 = 224: c1a7aef Win32: symlink: add support for symlinks to directories

  • 227: 3903bbc = 225: b89202a mingw: try to create symlinks without elevated permissions

  • 228: 37d8a03 = 226: bdf06c2 mingw: emulate stat() a little more faithfully

  • 229: 721b645 = 227: a9bdb73 mingw: special-case index entries for symlinks with buggy size

  • 230: 44d9078 = 228: b55a2a8 mingw: introduce code to detect whether we're inside a Windows container

  • 231: 6729032 ! 229: 119b758 mingw: when running in a Windows container, try to rename() harder

    @@ Commit message
     
      ## compat/mingw.c ##
     @@ compat/mingw.c: int mingw_rename(const char *pold, const char *pnew)
    - 		return 0;
    - 	gle = GetLastError();
    + 		gle = GetLastError();
    + 	}
      
     +	if (gle == ERROR_ACCESS_DENIED && is_inside_windows_container()) {
     +		/* Fall back to copy to destination & remove source */
  • 232: 02332aa = 230: c5f5b96 mingw: move the file_attr_to_st_mode() function definition

  • 233: 492cfa7 = 231: db1d045 mingw: Windows Docker volumes are not symbolic links

  • 238: cf25bbc ! 232: 52abf30 mingw: work around rename() failing on a read-only file

    @@ Commit message
     
      ## compat/mingw.c ##
     @@ compat/mingw.c: int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz)
    - #undef rename
      int mingw_rename(const char *pold, const char *pnew)
      {
    + 	static int supports_file_rename_info_ex = 1;
     -	DWORD attrs = INVALID_FILE_ATTRIBUTES, gle;
     +	DWORD attrs = INVALID_FILE_ATTRIBUTES, gle, attrsold;
      	int tries = 0;
      	wchar_t wpold[MAX_LONG_PATH], wpnew[MAX_LONG_PATH];
    - 	if (xutftowcs_long_path(wpold, pold) < 0 ||
    + 	int wpnew_len;
     @@ compat/mingw.c: int mingw_rename(const char *pold, const char *pnew)
    - 		return 0;
    - 	gle = GetLastError();
    + 		gle = GetLastError();
    + 	}
      
     -	if (gle == ERROR_ACCESS_DENIED && is_inside_windows_container()) {
     -		/* Fall back to copy to destination & remove source */
  • 234: 9847064 = 233: fc8b238 Win32: symlink: move phantom symlink creation to a separate function

  • 235: 01be787 = 234: ac91977 Introduce helper to create symlinks that knows about index_state

  • 236: 3704977 = 235: bea18e6 mingw: allow to specify the symlink type in .gitattributes

  • 237: c2381fd = 236: 4c21896 Win32: symlink: add test for symlink attribute

  • 239: 2e1cfb8 = 237: f949963 mingw: explicitly specify with which cmd to prefix the cmdline

  • 240: 8d1cd93 = 238: eb7ace5 mingw: when path_lookup() failed, try BusyBox

  • 241: f13ebfb ! 239: 7a3f220 test-lib: avoid unnecessary Perl invocation

    @@ t/test-lib.sh: EDITOR=:
     -		PERF_
     -		CURL_VERBOSE
     -		TRACE_CURL
    +-		BUILD_DIR
     -	));
     -	my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
     -	print join("\n", @vars);
    @@ t/test-lib.sh: EDITOR=:
     +	-e '/^GIT_PERF_/d' \
     +	-e '/^GIT_CURL_VERBOSE/d' \
     +	-e '/^GIT_TRACE_CURL/d' \
    ++	-e '/^GIT_BUILD_DIR/d' \
     +	-e 's/^\(GIT_[^=]*\)=.*/\1/p')
      unset XDG_CACHE_HOME
      unset XDG_CONFIG_HOME
  • 242: b7f932c = 240: 663e378 test-tool: learn to act as a drop-in replacement for iconv

  • 243: 4d1c8b1 = 241: 63afa40 tests(mingw): if iconv is unavailable, use test-helper --iconv

  • 244: 02cbbe7 = 242: dc15951 gitattributes: mark .png files as binary

  • 245: d539e10 ! 243: ecf0bf3 tests: move test PNGs into t/lib-diff/

    @@ t/t6403-merge-file.sh: test_expect_success "expected conflict markers" '
      		:orig.txt :test-binary-1.png :new1.txt 2> merge.err &&
     
      ## t/t6407-merge-binary.sh ##
    -@@ t/t6407-merge-binary.sh: TEST_PASSES_SANITIZE_LEAK=true
    +@@ t/t6407-merge-binary.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
      
      test_expect_success setup '
      
  • 246: be5515e = 244: bd7faf9 tests: only override sort & find if there are usable ones in /usr/bin/

  • 247: ac4b91a ! 245: ecddfbc tests: use the correct path separator with BusyBox

    @@ t/lib-proto-disable.sh: setup_ext_wrapper () {
      }
     
      ## t/t0021-conversion.sh ##
    -@@ t/t0021-conversion.sh: TEST_PASSES_SANITIZE_LEAK=true
    +@@ t/t0021-conversion.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
      . ./test-lib.sh
      . "$TEST_DIRECTORY"/lib-terminal.sh
      
    @@ t/test-lib.sh: else # normal case, use ../bin-wrappers only unless $with_dashes:
     +		PATH="$GIT_BUILD_DIR$PATH_SEP$GIT_BUILD_DIR/t/helper$PATH_SEP$PATH"
      	fi
      fi
    - GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt
    + GIT_TEMPLATE_DIR="$GIT_TEST_TEMPLATE_DIR"
  • 248: 7304ba5 = 246: 9c0a72c mingw: only use Bash-ism builtin pwd -W when available

  • 249: 3078bdb = 247: e29fac0 tests (mingw): remove Bash-specific pwd option

  • 250: c42863a = 248: e2ef255 test-lib: add BUSYBOX prerequisite

  • 251: 37cc59c = 249: 8f16041 t5003: use binary file from t/lib-diff/

  • 252: cfb83ab = 250: 6b0159a t5532: workaround for BusyBox on Windows

  • 253: 113706c = 251: c683717 t5605: special-case hardlink test for BusyBox-w32

  • 254: 9afcac0 = 252: 809f953 t5813: allow for $PWD to be a Windows path

  • 255: 0a64894 = 253: 56a44c8 t9200: skip tests when $PWD contains a colon

  • 256: 228d139 = 254: c674d71 mingw: add a Makefile target to copy test artifacts

  • 258: 16b12db = 255: c6e9e8c mingw: kill child processes in a gentler way

  • 257: 5f5aad9 = 256: 3f1692d mingw: optionally enable wsl compability file mode bits

  • 260: fd2663d = 257: fad419a mingw: really handle SIGINT

  • 266: 8638ef4 = 258: a5d71ae Describe Git for Windows' architecture [no ci]

  • 259: 9d6f549 = 259: 391fac8 mingw: do not call xutftowcs_path in mingw_mktemp

  • 262: e59bd66 = 260: 310e7e6 Add a GitHub workflow to monitor component updates

  • 267: ce425d1 = 261: 645d823 Modify the Code of Conduct for Git for Windows

  • 261: d66d168 = 262: f5dae7c Partially un-revert "editor: save and reset terminal after calling EDITOR"

  • 263: 0665635 = 263: 29bd6ac reset: reinstate support for the deprecated --stdin option

  • 264: 5a344f0 = 264: c7df407 fsmonitor: reintroduce core.useBuiltinFSMonitor

  • 265: 8299d91 = 265: 4fe21ad dependabot: help keeping GitHub Actions versions up to date

  • 268: 969b198 = 266: ed1cc83 CONTRIBUTING.md: add guide for first-time contributors

  • 269: 3946a5f = 267: 4b18613 README.md: Add a Windows-specific preamble

  • 270: 4a8cf2f = 268: 37c910b Add an issue template

  • 271: c169b69 = 269: daae9e5 Modify the GitHub Pull Request template (to reflect Git for Windows)

  • 272: 4931518 = 270: 646ab40 Document how $HOME is set on Windows

  • 273: bb1e874 = 271: 21b9ad2 SECURITY.md: document Git for Windows' policies

146: b5b22c9 ! 146: cd3bad1 survey: stub in new experimental 'git-survey' command

 @@ Documentation/git-survey.txt (new)
 +SYNOPSIS
 +--------
 +[verse]
-+(EXPERIMENTAL!) `git survey` <options>
++(EXPERIMENTAL!) 'git survey' <options>
 +
 +DESCRIPTION
 +-----------

This is newly required by a more stringent test in upstream's t0450.

@dscho dscho added this to the Next release milestone Dec 16, 2024
@dscho dscho requested a review from mjcheetham December 16, 2024 20:38
@dscho dscho force-pushed the rebase-to-v2.48.0-rc0 branch from be5d150 to a23491e Compare December 16, 2024 20:51
derrickstolee and others added 27 commits December 17, 2024 00:43

Verified

This commit was signed with the committer’s verified signature.
flaeppe Petter Friberg
In anticipation of using the path-walk API to analyze tags or include
them in a pack-file, add the ability to walk the tags that were included
in the revision walk.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
The sparse tree walk algorithm was created in d5d2e93 (revision:
implement sparse algorithm, 2019-01-16) and involves using the
mark_trees_uninteresting_sparse() method. This method takes a repository
and an oidset of tree IDs, some of which have the UNINTERESTING flag and
some of which do not.

Create a method that has an equivalent set of preconditions but uses a
"dense" walk (recursively visits all reachable trees, as long as they
have not previously been marked UNINTERESTING). This is an important
difference from mark_tree_uninteresting(), which short-circuits if the
given tree has the UNINTERESTING flag.

A use of this method will be added in a later change, with a condition
set whether the sparse or dense approach should be used.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
This option causes the path-walk API to act like the sparse tree-walk
algorithm implemented by mark_trees_uninteresting_sparse() in
list-objects.c.

Starting from the commits marked as UNINTERESTING, their root trees and
all objects reachable from those trees are UNINTERSTING, at least as we
walk path-by-path. When we reach a path where all objects associated
with that path are marked UNINTERESTING, then do no continue walking the
children of that path.

We need to be careful to pass the UNINTERESTING flag in a deep way on
the UNINTERESTING objects before we start the path-walk, or else the
depth-first search for the path-walk API may accidentally report some
objects as interesting.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
This will be helpful in a future change.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
In order to more easily compute delta bases among objects that appear at the
exact same path, add a --path-walk option to 'git pack-objects'.

This option will use the path-walk API instead of the object walk given by
the revision machinery. Since objects will be provided in batches
representing a common path, those objects can be tested for delta bases
immediately instead of waiting for a sort of the full object list by
name-hash. This has multiple benefits, including avoiding collisions by
name-hash.

The objects marked as UNINTERESTING are included in these batches, so we
are guaranteeing some locality to find good delta bases.

After the individual passes are done on a per-path basis, the default
name-hash is used to find other opportunistic delta bases that did not
match exactly by the full path name.

RFC TODO: It is important to note that this option is inherently
incompatible with using a bitmap index. This walk probably also does not
work with other advanced features, such as delta islands.

Getting ahead of myself, this option compares well with --full-name-hash
when the packfile is large enough, but also performs at least as well as
the default in all cases that I've seen.

RFC TODO: this should probably be recording the batch locations to another
list so they could be processed in a second phase using threads.

RFC TODO: list some examples of how this outperforms previous pack-objects
strategies. (This is coming in later commits that include performance
test changes.)

Signed-off-by: Derrick Stolee <stolee@gmail.com>
There are many tests that validate whether 'git pack-objects' works as
expected. Instead of duplicating these tests, add a new test environment
variable, GIT_TEST_PACK_PATH_WALK, that implies --path-walk by default
when specified.

This was useful in testing the implementation of the --path-walk
implementation, especially in conjunction with test such as:

 - t0411-clone-from-partial.sh : One test fetches from a repo that does
   not have the boundary objects. This causes the path-based walk to
   fail. Disable the variable for this test.

 - t5306-pack-nobase.sh : Similar to t0411, one test fetches from a repo
   without a boundary object.

 - t5310-pack-bitmaps.sh : One test compares the case when packing with
   bitmaps to the case when packing without them. Since we disable the
   test variable when writing bitmaps, this causes a difference in the
   object list (the --path-walk option adds an extra object). Specify
   --no-path-walk in both processes for the comparison. Another test
   checks for a specific delta base, but when computing dynamically
   without using bitmaps, the base object it too small to be considered
   in the delta calculations so no base is used.

 - t5316-pack-delta-depth.sh : This script cares about certain delta
   choices and their chain lengths. The --path-walk option changes how
   these chains are selected, and thus changes the results of this test.

 - t5322-pack-objects-sparse.sh : This demonstrates the effectiveness of
   the --sparse option and how it combines with --path-walk.

 - t5332-multi-pack-reuse.sh : This test verifies that the preferred
   pack is used for delta reuse when possible. The --path-walk option is
   not currently aware of the preferred pack at all, so finds a
   different delta base.

 - t7406-submodule-update.sh : When using the variable, the --depth
   option collides with the --path-walk feature, resulting in a warning
   message. Disable the variable so this warning does not appear.

I want to call out one specific test change that is only temporary:

 - t5530-upload-pack-error.sh : One test cares specifically about an
   "unable to read" error message. Since the current implementation
   performs delta calculations within the path-walk API callback, a
   different "unable to get size" error message appears. When this
   is changed in a future refactoring, this test change can be reverted.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Since 'git pack-objects' supports a --path-walk option, allow passing it
through in 'git repack'. This presents interesting testing opportunities for
comparing the different repacking strategies against each other.

Add the --path-walk option to the performance tests in p5313.

For the microsoft/fluentui repo [1] checked out at a specific commit [2],
the results are very interesting:

Test                                           this tree
------------------------------------------------------------------
5313.2: thin pack                              0.40(0.47+0.04)
5313.3: thin pack size                                    1.2M
5313.4: thin pack with --full-name-hash        0.09(0.10+0.04)
5313.5: thin pack size with --full-name-hash             22.8K
5313.6: thin pack with --path-walk             0.08(0.06+0.02)
5313.7: thin pack size with --path-walk                  20.8K
5313.8: big pack                               2.16(8.43+0.23)
5313.9: big pack size                                    17.7M
5313.10: big pack with --full-name-hash        1.42(3.06+0.21)
5313.11: big pack size with --full-name-hash             18.0M
5313.12: big pack with --path-walk             2.21(8.39+0.24)
5313.13: big pack size with --path-walk                  17.8M
5313.14: repack                                98.05(662.37+2.64)
5313.15: repack size                                    449.1K
5313.16: repack with --full-name-hash          33.95(129.44+2.63)
5313.17: repack size with --full-name-hash              182.9K
5313.18: repack with --path-walk               106.21(121.58+0.82)
5313.19: repack size with --path-walk                   159.6K

[1] https://github.com/microsoft/fluentui
[2] e70848ebac1cd720875bccaa3026f4a9ed700e08

This repo suffers from having a lot of paths that collide in the name
hash, so examining them in groups by path leads to better deltas. Also,
in this case, the single-threaded implementation is competitive with the
full repack. This is saving time diffing files that have significant
differences from each other.

A similar, but private, repo has even more extremes in the thin packs:

Test                                           this tree
--------------------------------------------------------------
5313.2: thin pack                              2.39(2.91+0.10)
5313.3: thin pack size                                    4.5M
5313.4: thin pack with --full-name-hash        0.29(0.47+0.12)
5313.5: thin pack size with --full-name-hash             15.5K
5313.6: thin pack with --path-walk             0.35(0.31+0.04)
5313.7: thin pack size with --path-walk                  14.2K

Notice, however, that while the --full-name-hash version is working
quite well in these cases for the thin pack, it does poorly for some
other standard cases, such as this test on the Linux kernel repository:

Test                                           this tree
--------------------------------------------------------------
5313.2: thin pack                              0.01(0.00+0.00)
5313.3: thin pack size                                     310
5313.4: thin pack with --full-name-hash        0.00(0.00+0.00)
5313.5: thin pack size with --full-name-hash              1.4K
5313.6: thin pack with --path-walk             0.00(0.00+0.00)
5313.7: thin pack size with --path-walk                    310

Here, the --full-name-hash option does much worse than the default name
hash, but the path-walk option does exactly as well.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Users may want to enable the --path-walk option for 'git pack-objects' by
default, especially underneath commands like 'git push' or 'git repack'.

This should be limited to client repositories, since the --path-walk option
disables bitmap walks, so would be bad to include in Git servers when
serving fetches and clones. There is potential that it may be helpful to
consider when repacking the repository, to take advantage of improved deltas
across historical versions of the same files.

Much like how "pack.useSparse" was introduced and included in
"feature.experimental" before being enabled by default, use the repository
settings infrastructure to make the new "pack.usePathWalk" config enabled by
"feature.experimental" and "feature.manyFiles".

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Repositories registered with Scalar are expected to be client-only
repositories that are rather large. This means that they are more likely to
be good candidates for using the --path-walk option when running 'git
pack-objects', especially under the hood of 'git push'. Enable this config
in Scalar repositories.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Previously, the --path-walk option to 'git pack-objects' would compute
deltas inline with the path-walk logic. This would make the progress
indicator look like it is taking a long time to enumerate objects, and
then very quickly computed deltas.

Instead of computing deltas on each region of objects organized by tree,
store a list of regions corresponding to these groups. These can later
be pulled from the list for delta compression before doing the "global"
delta search.

This presents a new progress indicator that can be used in tests to
verify that this stage is happening.

The current implementation is not integrated with threads, but could be
done in a future update.

Since we do not attempt to sort objects by size until after exploring
all trees, we can remove the previous change to t5530 due to a different
error message appearing first.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
In anticipation of implementing 'git backfill', populate the necessary files
with the boilerplate of a new builtin.

RFC TODO: When preparing this for a full implementation, make sure it is
based on the newest standards introduced by [1].

[1] https://lore.kernel.org/git/xmqqjzfq2f0f.fsf@gitster.g/T/#m606036ea2e75a6d6819d6b5c90e729643b0ff7f7
    [PATCH 1/3] builtin: add a repository parameter for builtin functions

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Adapting the implementation of ll_find_deltas(), create a threaded
version of the --path-walk compression step in 'git pack-objects'.

This involves adding a 'regions' member to the thread_params struct,
allowing each thread to own a section of paths. We can simplify the way
jobs are split because there is no value in extending the batch based on
name-hash the way sections of the object entry array are attempted to be
grouped. We re-use the 'list_size' and 'remaining' items for the purpose
of borrowing work in progress from other "victim" threads when a thread
has finished its batch of work more quickly.

Using the Git repository as a test repo, the p5313 performance test
shows that the resulting size of the repo is the same, but the threaded
implementation gives gains of varying degrees depending on the number of
objects being packed. (This was tested on a 16-core machine.)

Test                                    HEAD~1    HEAD
-------------------------------------------------------------
5313.6: thin pack with --path-walk        0.01    0.01  +0.0%
5313.7: thin pack size with --path-walk    475     475  +0.0%
5313.12: big pack with --path-walk        1.99    1.87  -6.0%
5313.13: big pack size with --path-walk  14.4M   14.3M  -0.4%
5313.18: repack with --path-walk         98.14   41.46 -57.8%
5313.19: repack size with --path-walk   197.2M  197.3M  +0.0%

Signed-off-by: Derrick Stolee <stolee@gmail.com>
When adding tree objects, we are very careful to avoid adding the same
tree object more than once. There was one small gap in that logic,
though: when adding a root tree object. Two refs can easily share the
same root tree object, and we should still not add it more than once.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
The default behavior of 'git backfill' is to fetch all missing blobs that
are reachable from HEAD. Document and test this behavior.

The implementation is a very simple use of the path-walk API, initializing
the revision walk at HEAD to start the path-walk from all commits reachable
from HEAD. Ignore the object arrays that correspond to tree entries,
assuming that they are all present already.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Users may want to specify a minimum batch size for their needs. This is only
a minimum: the path-walk API provides a list of OIDs that correspond to the
same path, and thus it is optimal to allow delta compression across those
objects in a single server request.

We could consider limiting the request to have a maximum batch size in the
future.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Start work on a new 'git survey' command to scan the repository
for monorepo performance and scaling problems.  The goal is to
measure the various known "dimensions of scale" and serve as a
foundation for adding additional measurements as we learn more
about Git monorepo scaling problems.

The initial goal is to complement the scanning and analysis performed
by the GO-based 'git-sizer' (https://github.com/github/git-sizer) tool.
It is hoped that by creating a builtin command, we may be able to take
advantage of internal Git data structures and code that is not
accessible from GO to gain further insight into potential scaling
problems.

Co-authored-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Jeff Hostetler <git@jeffhostetler.com>
Signed-off-by: Derrick Stolee <stolee@gmail.com>
By default we will scan all references in "refs/heads/", "refs/tags/"
and "refs/remotes/".

Add command line opts let the use ask for all refs or a subset of them
and to include a detached HEAD.

Signed-off-by: Jeff Hostetler <git@jeffhostetler.com>
Signed-off-by: Derrick Stolee <stolee@gmail.com>
When 'git survey' provides information to the user, this will be presented
in one of two formats: plaintext and JSON. The JSON implementation will be
delayed until the functionality is complete for the plaintext format.

The most important parts of the plaintext format are headers specifying the
different sections of the report and tables providing concreted data.

Create a custom table data structure that allows specifying a list of
strings for the row values. When printing the table, check each column for
the maximum width so we can create a table of the correct size from the
start.

The table structure is designed to be flexible to the different kinds of
output that will be implemented in future changes.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
At the moment, nothing is obvious about the reason for the use of the
path-walk API, but this will become more prevelant in future iterations. For
now, use the path-walk API to sum up the counts of each kind of object.

For example, this is the reachable object summary output for my local repo:

REACHABLE OBJECT SUMMARY
========================
Object Type |  Count
------------+-------
       Tags |   1343
    Commits | 179344
      Trees | 314350
      Blobs | 184030

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Now that we have explored objects by count, we can expand that a bit more to
summarize the data for the on-disk and inflated size of those objects. This
information is helpful for diagnosing both why disk space (and perhaps
clone or fetch times) is growing but also why certain operations are slow
because the inflated size of the abstract objects that must be processed is
so large.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Derrick Stolee <stolee@gmail.com>
In future changes, we will make use of these methods. The intention is to
keep track of the top contributors according to some metric. We don't want
to store all of the entries and do a sort at the end, so track a
constant-size table and remove rows that get pushed out depending on the
chosen sorting algorithm.

Co-authored-by: Jeff Hostetler <git@jeffhostetler.com>
Signed-off-by; Jeff Hostetler <git@jeffhostetler.com>
Signed-off-by: Derrick Stolee <stolee@gmail.com>
One way to significantly reduce the cost of a Git clone and later fetches is
to use a blobless partial clone and combine that with a sparse-checkout that
reduces the paths that need to be populated in the working directory. Not
only does this reduce the cost of clones and fetches, the sparse-checkout
reduces the number of objects needed to download from a promisor remote.

However, history investigations can be expensie as computing blob diffs will
trigger promisor remote requests for one object at a time. This can be
avoided by downloading the blobs needed for the given sparse-checkout using
'git backfill' and its new '--sparse' mode, at a time that the user is
willing to pay that extra cost.

Note that this is distinctly different from the '--filter=sparse:<oid>'
option, as this assumes that the partial clone has all reachable trees and
we are using client-side logic to avoid downloading blobs outside of the
sparse-checkout cone. This avoids the server-side cost of walking trees
while also achieving a similar goal. It also downloads in batches based on
similar path names, presenting a resumable download if things are
interrupted.

This augments the path-walk API to have a possibly-NULL 'pl' member that may
point to a 'struct pattern_list'. This could be more general than the
sparse-checkout definition at HEAD, but 'git backfill --sparse' is currently
the only consumer.

Be sure to test this in both cone mode and not cone mode. Cone mode has the
benefit that the path-walk can skip certain paths once they would expand
beyond the sparse-checkout.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Since we are already walking our reachable objects using the path-walk API,
let's now collect lists of the paths that contribute most to different
metrics. Specifically, we care about

 * Number of versions.
 * Total size on disk.
 * Total inflated size (no delta or zlib compression).

This information can be critical to discovering which parts of the
repository are causing the most growth, especially on-disk size. Different
packing strategies might help compress data more efficiently, but the toal
inflated size is a representation of the raw size of all snapshots of those
paths. Even when stored efficiently on disk, that size represents how much
information must be processed to complete a command such as 'git blame'.

Since the on-disk size is likely to be fragile, stop testing the exact
output of 'git survey' and check that the correct set of headers is
output.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
The previous change introduced the '--[no-]sparse' option for the 'git
backfill' command, but did not assume it as enabled by default. However,
this is likely the behavior that users will most often want to happen.
Without this default, users with a small sparse-checkout may be confused
when 'git backfill' downloads every version of every object in the full
history.

However, this is left as a separate change so this decision can be reviewed
independently of the value of the '--[no-]sparse' option.

Add a test of adding the '--sparse' option to a repo without sparse-checkout
to make it clear that supplying it without a sparse-checkout is an error.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
The 'git survey' builtin provides several detail tables, such as "top
files by on-disk size". The size of these tables defaults to 10,
currently.

Allow the user to specify this number via a new --top=<N> option or the
new survey.top config key.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This fixes a bug in the implementation of `ps/mingw-rename` that
prevented directories from being handled by the POSIX-compliant
`SetFileInformationByHandle()` code path.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho and others added 23 commits December 17, 2024 12:04
Rather than using private IFTTT Applets that send mails to this
maintainer whenever a new version of a Git for Windows component was
released, let's use the power of GitHub workflows to make this process
publicly visible.

This workflow monitors the Atom/RSS feeds, and opens a ticket whenever a
new version was released.

Note: Bash sometimes releases multiple patched versions within a few
minutes of each other (i.e. 5.1p1 through 5.1p4, 5.0p15 and 5.0p16). The
MSYS2 runtime also has a similar system. We can address those patches as
a group, so we shouldn't get multiple issues about them.

Note further: We're not acting on newlib releases, OpenSSL alphas, Perl
release candidates or non-stable Perl releases. There's no need to open
issues about them.

Co-authored-by: Matthias Aßhauer <mha1993@live.de>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Git for Windows accepts pull requests; Core Git does not. Therefore we
need to adjust the template (because it only matches core Git's
project management style, not ours).

Also: direct Git for Windows enhancements to their contributions page,
space out the text for easy reading, and clarify that the mailing list
is plain text, not HTML.

Signed-off-by: Philip Oakley <philipoakley@iee.org>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Git documentation refers to $HOME and $XDG_CONFIG_HOME often, but does not specify how or where these values come from on Windows where neither is set by default. The new documentation reflects the behavior of setup_windows_environment() in compat/mingw.c.

Signed-off-by: Alejandro Barreto <alejandro.barreto@ni.com>
These are Git for Windows' Git GUI and gitk patches. We will have to
decide at some point what to do about them, but that's a little lower
priority (as Git GUI seems to be unmaintained for the time being, and
the gitk maintainer keeps a very low profile on the Git mailing list,
too).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This is the recommended way on GitHub to describe policies revolving around
security issues and about supported versions.

Helped-by: Sven Strickroth <email@cs-ware.de>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
…dvice

clean: suggest using `core.longPaths` if paths are too long to remove
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This was pull request git-for-windows#1645 from ZCube/master

Support windows container.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
…ws#4527)

With this patch, Git for Windows works as intended on mounted APFS
volumes (where renaming read-only files would fail).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This patch introduces support to set special NTFS attributes that are
interpreted by the Windows Subsystem for Linux as file mode bits, UID
and GID.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Handle Ctrl+C in Git Bash nicely

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
A fix for calling `vim` in Windows Terminal caused a regression and was
reverted. We partially un-revert this, to get the fix again.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This topic branch re-adds the deprecated --stdin/-z options to `git
reset`. Those patches were overridden by a different set of options in
the upstream Git project before we could propose `--stdin`.

We offered this in MinGit to applications that wanted a safer way to
pass lots of pathspecs to Git, and these applications will need to be
adjusted.

Instead of `--stdin`, `--pathspec-from-file=-` should be used, and
instead of `-z`, `--pathspec-file-nul`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Originally introduced as `core.useBuiltinFSMonitor` in Git for Windows
and developed, improved and stabilized there, the built-in FSMonitor
only made it into upstream Git (after unnecessarily long hemming and
hawing and throwing overly perfectionist style review sticks into the
spokes) as `core.fsmonitor = true`.

In Git for Windows, with this topic branch, we re-introduce the
now-obsolete config setting, with warnings suggesting to existing users
how to switch to the new config setting, with the intention to
ultimately drop the patch at some stage.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
…updates

Start monitoring updates of Git for Windows' component in the open
Add a README.md for GitHub goodness.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
@dscho dscho force-pushed the rebase-to-v2.48.0-rc0 branch from f5b84f0 to 874e988 Compare December 17, 2024 11:05
@dscho
Copy link
Member Author

dscho commented Dec 17, 2024

Range-diff relative to latest force-push
  • -: ----------- > 1: a150449 cmake: better support for out-of-tree builds follow-up
  • -: ----------- > 2: 555743c cmake(mergetools): better support for out-of-tree builds
  • -: ----------- > 3: 1671a05 cmake: use the correct file name for the Perl header
  • -: ----------- > 4: 9d204d2 cmake: put the Perl modules into the correct location again
  • -: ----------- > 5: 3112552 cmake/vcxproj: stop special-casing remote-ext
  • 1: 13a855b = 6: ec576d5 Win32: make FILETIME conversion functions public
  • 2: 2cfac98 = 7: 9279dfb Win32: dirent.c: Move opendir down
  • 3: 09ec621 = 8: 055ab1b mingw: make the dirent implementation pluggable
  • 4: 7c4556d = 9: 414ec68 Win32: make the lstat implementation pluggable
  • 5: 58b466c = 10: 63400a8 mingw: add infrastructure for read-only file system level caches
  • 6: f561a17 = 11: 0121406 mingw: add a cache below mingw's lstat and dirent implementations
  • 7: 9093fb4 = 12: 8468338 fscache: load directories only once
  • 8: 5c395bd = 13: 8d99b81 fscache: add key for GIT_TRACE_FSCACHE
  • 9: 8364ce5 = 14: 4d2b5b6 fscache: remember not-found directories
  • 10: d891f79 = 15: d363684 fscache: add a test for the dir-not-found optimization
  • 11: a5bc67d = 16: 732e080 add: use preload-index and fscache for performance
  • 12: 5f51cab = 17: 542851f dir.c: make add_excludes aware of fscache during status
  • 13: 58b482d = 18: 15adc5a fscache: make fscache_enabled() public
  • 14: e5a1b5a = 19: 5406c77 dir.c: regression fix for add_excludes with fscache
  • 15: 9e5f3a6 = 20: 6f51ff9 fetch-pack.c: enable fscache for stats under .git/objects
  • 16: 9ad85d6 = 21: f0c36bf checkout.c: enable fscache for checkout again
  • 17: 1771ad4 = 22: 55a7b5c Enable the filesystem cache (fscache) in refresh_index().
  • 18: a72e791 = 23: e1fc253 fscache: use FindFirstFileExW to avoid retrieving the short name
  • 19: 52f4704 = 24: 7f1db36 status: disable and free fscache at the end of the status command
  • 20: f9784b6 = 25: 1962d8a fscache: add GIT_TEST_FSCACHE support
  • 21: c7db95a = 26: 634038d fscache: add fscache hit statistics
  • 22: a854ef6 = 27: 8e1d68a mem_pool: add GIT_TRACE_MEMPOOL support
  • 23: 5bb296c = 28: 3467b1a fscache: fscache takes an initial size
  • 24: 22e164a = 29: 52ddf03 fscache: update fscache to be thread specific instead of global
  • 25: 0006706 = 30: 0efde44 fscache: teach fscache to use mempool
  • 27: 32763c1 = 31: 0e644b7 fscache: make fscache_enable() thread safe
  • 29: 0ce3507 = 32: 570d994 fscache: teach fscache to use NtQueryDirectoryFile
  • 32: f93737e = 33: 9dff7b5 unpack-trees: enable fscache for sparse-checkout
  • 35: 3fc63ff = 34: 3a54c42 fscache: remember the reparse tag for each entry
  • 38: 32ca80b = 35: f864334 fscache: implement an FSCache-aware is_mount_point()
  • 40: 5cb4b85 = 36: 661e162 clean: make use of FSCache
  • 26: 7cbf9b1 = 37: 4202631 git-gui: provide question helper for retry fallback on Windows
  • 28: 51884ce = 38: acf9a7c git gui: set GIT_ASKPASS=git-gui--askpass if not set yet
  • 31: 8d1c7f5 = 39: 7c1d577 git-gui--askyesno: fix funny text wrapping
  • 34: 49e755d = 40: fe69b7a git-gui--askyesno: allow overriding the window title
  • 37: feebc90 = 41: 324aea6 git-gui--askyesno (mingw): use Git for Windows' icon, if available
  • 30: 8e1b77b = 42: 08da229 gitk: Unicode file name support
  • 33: d81f827 = 43: d76caf6 gitk: Use an external icon file on Windows
  • 36: 46958fd = 44: 288d132 gitk: fix arrow keys in input fields with Tcl/Tk >= 8.6
  • 39: 503f683 = 45: c41a447 gitk: make the "list references" default window width wider
  • 41: 7107e49 = 46: c1c919c pack-objects (mingw): demonstrate a segmentation fault with large deltas
  • 42: f8670b9 = 47: 79a3c8a mingw: support long paths
  • 43: 53f7dd0 = 48: 9003e33 Win32: fix 'lstat("dir/")' with long paths
  • 44: 07873ad = 49: 29c782d win32(long path support): leave drive-less absolute paths intact
  • 54: 4054e27 = 50: 63d220b compat/fsmonitor/fsm-*-win32: support long paths
  • 45: 1d4dbfd = 51: 9b5ba98 mingw: Support git_terminal_prompt with more terminals
  • 46: 9c681f4 = 52: a6daf6e compat/terminal.c: only use the Windows console if bash 'read -r' fails
  • 47: 8442e8f = 53: 7ae4874 mingw (git_terminal_prompt): do fall back to CONIN$/CONOUT$ method
  • 48: 95c08c3 = 54: 46279d9 strbuf_readlink: don't call readlink twice if hint is the exact link size
  • 55: d004d56 = 55: e79d110 clean: suggest using core.longPaths if paths are too long to remove
  • 49: 6cd420c = 56: ac316d1 strbuf_readlink: support link targets that exceed PATH_MAX
  • 50: 1e866f4 = 57: fa4fddf lockfile.c: use is_dir_sep() instead of hardcoded '/' checks
  • 51: 30d0cf3 = 58: f8ac948 Win32: don't call GetFileAttributes twice in mingw_lstat()
  • 52: d964fd1 = 59: 2bb1e6e Win32: implement stat() with symlink support
  • 53: 111568b = 60: f3c9296 Win32: remove separate do_lstat() function
  • 56: 64f3fed = 61: db1a414 Win32: let mingw_lstat() error early upon problems with reparse points
  • 57: cb01309 = 62: 515cc68 mingw: teach fscache and dirent about symlinks
  • 58: 3d304ba = 63: e4dcb79 Win32: lstat(): return adequate stat.st_size for symlinks
  • 59: f4cec4e = 64: 9e4afe6 Win32: factor out retry logic
  • 60: 1e7a583 = 65: 84d9820 Win32: change default of 'core.symlinks' to false
  • 61: 4a9dbad = 66: 1d45809 Win32: add symlink-specific error codes
  • 62: 32b2395 = 67: 4de059f Win32: mingw_unlink: support symlinks to directories
  • 63: 96ccc90 = 68: 961af97 Win32: mingw_rename: support renaming symlinks
  • 64: 476b4bd = 69: 81da756 Win32: mingw_chdir: change to symlink-resolved directory
  • 65: cd2496a = 70: 5a99c68 Win32: implement readlink()
  • 66: 397d7fc = 71: cb332f8 mingw: lstat: compute correct size for symlinks
  • 67: 494d766 = 72: 89f21d2 Win32: implement basic symlink() functionality (file symlinks only)
  • 68: 622d3ce = 73: 386a891 Win32: symlink: add support for symlinks to directories
  • 69: 3b2e5f3 = 74: 88ba28a mingw: try to create symlinks without elevated permissions
  • 70: 72fff60 = 75: 1dc2358 mingw: emulate stat() a little more faithfully
  • 71: 8d61ab5 = 76: 5dd4668 mingw: special-case index entries for symlinks with buggy size
  • 89: bb148a6 = 77: 1c10ce3 mingw: introduce code to detect whether we're inside a Windows container
  • 91: a08005c = 78: 1e220c0 mingw: when running in a Windows container, try to rename() harder
  • 93: 4468a9a = 79: e617430 mingw: move the file_attr_to_st_mode() function definition
  • 72: 5971cf8 = 80: 07c0a27 Win32: symlink: move phantom symlink creation to a separate function
  • 95: 67aa1db = 81: eb12ea2 mingw: Windows Docker volumes are not symbolic links
  • 73: 31b70a8 = 82: 15384ce Introduce helper to create symlinks that knows about index_state
  • 97: fe36c17 = 83: 5b9e665 mingw: work around rename() failing on a read-only file
  • 74: dd69fa2 = 84: d0c63fc mingw: allow to specify the symlink type in .gitattributes
  • 75: 2c2b68b = 85: e4b6fbb Win32: symlink: add test for symlink attribute
  • 76: 3ca5a45 = 86: 45bac5f mingw: explicitly specify with which cmd to prefix the cmdline
  • 77: 9854a9d = 87: 37decb7 mingw: when path_lookup() failed, try BusyBox
  • 78: ea0bc08 = 88: 07fec36 test-lib: avoid unnecessary Perl invocation
  • 79: 25fecc5 = 89: 702299d test-tool: learn to act as a drop-in replacement for iconv
  • 80: cddacfe = 90: 601e0da tests(mingw): if iconv is unavailable, use test-helper --iconv
  • 81: 01591d7 = 91: 577a559 gitattributes: mark .png files as binary
  • 82: 320619d = 92: ee2fa97 tests: move test PNGs into t/lib-diff/
  • 83: 213f740 = 93: d16830e tests: only override sort & find if there are usable ones in /usr/bin/
  • 84: e820107 = 94: c11bf87 tests: use the correct path separator with BusyBox
  • 85: 2677f0a = 95: fab7c33 mingw: only use Bash-ism builtin pwd -W when available
  • 86: 0b0d964 = 96: f5baf12 tests (mingw): remove Bash-specific pwd option
  • 87: cd4fc8f = 97: eb3e36a test-lib: add BUSYBOX prerequisite
  • 88: 5e6dd05 = 98: 2af28e3 t5003: use binary file from t/lib-diff/
  • 90: c079d72 = 99: 0085446 t5532: workaround for BusyBox on Windows
  • 92: 06101b9 = 100: 39e29a7 t5605: special-case hardlink test for BusyBox-w32
  • 94: a397d50 = 101: 1328e05 t5813: allow for $PWD to be a Windows path
  • 96: a4cfc1c = 102: 7e177a9 t9200: skip tests when $PWD contains a colon
  • 104: 5431cd4 = 103: 4cf2e36 mingw: add a Makefile target to copy test artifacts
  • 105: 9d0ed6a = 104: cc5440a mingw: kill child processes in a gentler way
  • 109: 31c3a89 = 105: 8220040 mingw: optionally enable wsl compability file mode bits
  • 106: d8fa9d6 = 106: a4fc574 mingw: do not call xutftowcs_path in mingw_mktemp
  • 110: 848c308 = 107: d2dbe72 mingw: really handle SIGINT
  • 111: 1a11491 = 108: 9d05384 Partially un-revert "editor: save and reset terminal after calling EDITOR"
  • 112: c7bc631 = 109: 09ac5d9 reset: reinstate support for the deprecated --stdin option
  • 113: e57066b = 110: 9c1c5e0 fsmonitor: reintroduce core.useBuiltinFSMonitor
  • 98: ecc57c4 = 111: c70b1f4 Describe Git for Windows' architecture [no ci]
  • 99: 35de097 = 112: 3f6c794 Modify the Code of Conduct for Git for Windows
  • 100: d67c222 = 113: 0e9c0e2 CONTRIBUTING.md: add guide for first-time contributors
  • 101: de59eac = 114: 7f6bb21 README.md: Add a Windows-specific preamble
  • 102: 51438cb = 115: 4e9118a Add an issue template
  • 107: b536871 = 116: e4a253a Add a GitHub workflow to monitor component updates
  • 103: 4469b6a = 117: 69d6c8d Modify the GitHub Pull Request template (to reflect Git for Windows)
  • 114: afd2919 = 118: b6ae40e dependabot: help keeping GitHub Actions versions up to date
  • 108: 2e70950 = 119: adc85a7 Document how $HOME is set on Windows
  • 115: f26ecbd = 120: 75db731 SECURITY.md: document Git for Windows' policies

Half a dozen CMake patches are required to make this work again.

@dscho
Copy link
Member Author

dscho commented Dec 17, 2024

/git-artifacts

The tag-git workflow run was started

The git-artifacts-x86_64 workflow run was started.
The git-artifacts-i686 workflow run was started.
The git-artifacts-aarch64 workflow run was started.

Copy link
Member

@mjcheetham mjcheetham left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Range diffs and new cmake commits all looks good to me!

@dscho
Copy link
Member Author

dscho commented Dec 17, 2024

/release

The release-git workflow run was started

@gitforwindowshelper gitforwindowshelper bot merged commit 874e988 into git-for-windows:main Dec 17, 2024
69 of 70 checks passed
@dscho dscho deleted the rebase-to-v2.48.0-rc0 branch December 17, 2024 12:46
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.

[New git version] v2.48.0-rc0