Volume XXII, number 279Tuesday, October 6, 2026Latest message 34 minutes ago

The Git List

News and archive of git@vger.kernel.org, since April 2005

[BUG] sparse-checkout: checkout clobbers untracked in-cone file

1 messages between Sep 30, 2026 and Sep 30, 2026, from Webstrand.

Plain Markdown or JSON for tools and agents.

WebstrandSep 30, 2026, 20:20 UTC on lore
What did you do before the bug happened? (Steps to reproduce your issue)
    git init --initial-branch=locus repo
    cd repo
    mkdir src docs
    echo "tracked" >src/tracked.txt
    echo "tracked" >docs/tracked.txt
    git add .
    git commit --message="initial"
    git sparse-checkout set src
    git branch some-feature-branch
    git checkout some-feature-branch
    echo "incoming" >src/new.txt
    git add src/new.txt
    git commit --message="add src/new.txt"
    git checkout locus
    echo "local" >src/new.txt # conflicting untracked file
    git checkout some-feature-branch
    echo $?
    cat src/new.txt
What did you expect to happen? (Expected behavior)
The checkout operation should be aborted as a whole:
 1. No files in the working tree should be updated.
 2. HEAD should not be moved and should continue to reference locus.
 3. src/new.txt must be unmodified, preserving the untracked content
    "local".
 4. git should exit with status 1 and print the following error:
    error: The following untracked working tree files would be
overwritten by checkout:
        src/new.txt
    Please move or remove them before you switch branches.
    Aborting

Sparse checkouts should have the same behavior as non-sparse checkouts of the same commits.

What happened instead? (Actual behavior)
The checkout operation clobbered untracked files:
 1. Files in the working tree were updated.
 2. HEAD was moved to reference some-feature-branch.
 3. src/new.txt was overwritten with the content "incoming", clobbering
    it.
 4. git exited with status 0 and printed the following warning:
    warning: The following paths were already present and thus not
updated despite sparse patterns:
        src/new.txt
    After fixing the above paths, you may want to run `git
sparse-checkout reapply`.
    Switched to branch 'some-feature-branch'
Additionally, the produced warning is incorrect and misleading.
What's different between what you expected and what actually happened?

The checkout completed instead of being aborted, src/new.txt was clobbered instead of preserved, and the conflict was reported as a warning instead of an error, and the warning was incorrect and misleading. As a result, the untracked content of src/new.txt was destroyed.

Anything else you want to add:

The behavior is present from v2.27.0, the first release to contain 681c637b4a, through the tip of master (a018953688).

The behavior was introduced by
681c637b4a unpack-trees: failure to set SKIP_WORKTREE bits always just a warning

Prior to 681c6, git refused the sparse checkout, producing the same error as the non-sparse checkout, with the same behavior as in "Expected behavior". src/new.txt was not clobbered. Starting with 681c6, git completes the sparse checkout with the warning shown in "Actual behavior", and src/new.txt is clobbered.

[System Info]
git version 2.56.0
cpu: x86_64
built from commit: a018953688f1b10bddf91bff8747068f5f4746a4
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
rust: enabled
feature: fsmonitor--daemon
gettext: enabled
libcurl: 8.22.0
OpenSSL: OpenSSL 3.5.3 16 Sep 2025
zlib: 1.3.1
SHA-1: SHA1_DC
SHA-256: SHA256_BLK
default-ref-format: files
default-hash: sha1
uname: Linux 7.2.7-1-default #1 SMP PREEMPT_DYNAMIC Tue Sep 22
08:00:24 UTC 2026 (e601a2d) x86_64
compiler info: gnuc: 16.2
libc info: glibc: 2.44
$SHELL (typically, interactive shell): /bin/bash

[Enabled Hooks] not run from a git repository - no hooks to show

Back to recent threads