Am 30.09.21 um 02:49 schrieb Robert Leftwich: > Thank you for filling out a Git bug report! > Please answer the following questions to help us understand your issue. > > What did you do before the bug happened? (Steps to reproduce your issue) > Initialised a repo and added a file or cloned a repo inside an existing > repo (think dependencies). > See https://github.com/gitpod-io/gitpod/issues/5675 for background. > > In an existing repo: > $ mkdir sub_test && cd sub_test/ && git init . && touch test.txt && git > add test.txt > OR > $ git clone https://github.com/stencila/test.git sub_test > THEN > $ git stash push -u > > What did you expect to happen? (Expected behavior) > Command should complete without error but ignore the directory (this is > the existing behavior prior to v2.31) > $ git stash push -u > Ignoring path sub_test > Saved working directory and index state WIP on (no branch): 94f6e3e283 > Git 2.30.2 > > What happened instead? (Actual behavior) > Command failed > $ git stash push -u > error: sub_test/: is a directory - add files inside instead > fatal: Unable to process path sub_test/ > Cannot save the untracked files > > What's different between what you expected and what actually happened? > Command failed > > Anything else you want to add: > It happens on all versions from v2.31 to current master. > It is specifically related to this change: > > https://github.com/git/git/commit/6e773527b6b03976cefbb0f9571bd40dd5995e6c#diff-70525b6b89c7cac91e520085d954a68671038d218b77d22855e938ab075a68d8L1006 > > If this is the new expected behavior perhaps it can result in a better > error message and related documentation? > > Please review the rest of the bug report below. > You can delete any lines you don't wish to share. Looping in Stolee as the author of 6e773527b6 (sparse-index: convert from full to sparse, 2021-03-30). > > > [System Info] > git version: > git version 2.33.0.610.gcefe983a32 > cpu: x86_64 > built from commit: cefe983a320c03d7843ac78e73bd513a27806845 > sizeof-long: 8 > sizeof-size_t: 8 > shell-path: /bin/sh > uname: Linux 5.4.0-1051-gke #54-Ubuntu SMP Thu Aug 5 18:52:13 UTC 2021 > x86_64 > compiler info: gnuc: 9.3 > libc info: glibc: 2.31 > $SHELL (typically, interactive shell): /bin/bash > > > [Enabled Hooks] > Here's a raw patch for that. Versions before 6e773527b6 pass the included test. The magic return value of 2 is a bit ugly, but allows adding the additional check only to the call-site relevant to the bug report. I don't know if other callers of verify_path() might also need that check, or if it is too narrow. René --- builtin/update-index.c | 15 ++++++++++++++- read-cache.c | 2 +- t/t3905-stash-include-untracked.sh | 6 ++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/builtin/update-index.c b/builtin/update-index.c index 187203e8bb..3d32db7304 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -445,10 +445,22 @@ static void chmod_path(char flip, const char *path) die("git update-index: cannot chmod %cx '%s'", flip, path); } +static int is_nonbare_repo_dir(const char *path) +{ + int ret; + struct strbuf sb = STRBUF_INIT; + + strbuf_addstr(&sb, path); + ret = is_nonbare_repository_dir(&sb); + strbuf_release(&sb); + return ret; +} + static void update_one(const char *path) { int stat_errno = 0; struct stat st; + int ret; if (mark_valid_only || mark_skip_worktree_only || force_remove || mark_fsmonitor_only) @@ -458,7 +470,8 @@ static void update_one(const char *path) stat_errno = errno; } /* else stat is valid */ - if (!verify_path(path, st.st_mode)) { + ret = verify_path(path, st.st_mode); + if (ret == 0 || (ret == 2 && is_nonbare_repo_dir(path))) { fprintf(stderr, "Ignoring path %s\n", path); return; } diff --git a/read-cache.c b/read-cache.c index f5d4385c40..0188b5b798 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1040,7 +1040,7 @@ int verify_path(const char *path, unsigned mode) * sparse directory entries. */ if (c == '\0') - return S_ISDIR(mode); + return S_ISDIR(mode) ? 2 : 0; } else if (c == '\\' && protect_ntfs) { if (is_ntfs_dotgit(path)) return 0; diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh index dd2cdcc114..5390eec4e3 100755 --- a/t/t3905-stash-include-untracked.sh +++ b/t/t3905-stash-include-untracked.sh @@ -422,4 +422,10 @@ test_expect_success 'stash show --{include,only}-untracked on stashes without un test_must_be_empty actual ' +test_expect_success 'stash -u ignores sub-repository' ' + test_when_finished "rm -rf sub-repo" && + git init sub-repo && + git stash -u +' + test_done -- 2.33.0