mirror of
https://github.com/git/git
synced 2024-08-23 18:00:25 +00:00
![René Scharfe](/assets/img/avatar_default.png)
While git doesn't track empty directories, git archive can be tricked into putting some into archives. One way is to construct an empty tree object, as t5004 does. While that is supported by the object database, it can't be represented in the index and thus it's unlikely to occur in the wild. Another way is using the literal name of a directory in an exclude pathspec -- its contents are are excluded, but the directory stub is included. That's inconsistent: exclude pathspecs containing wildcards don't leave empty directories in the archive. Yet another way is have a few levels of nested subdirectories (e.g. d1/d2/d3/file1) and ignoring the entries at the leaves (e.g. file1). The directories with the ignored content are ignored as well (e.g. d3), but their empty parents are included (e.g. d2). As empty directories are not supported by git, they should also not be written into archives. If an empty directory is really needed then it can be tracked and archived by placing an empty .gitignore file in it. There already is a mechanism in place for suppressing empty directories. When read_tree_recursive() encounters a directory excluded by a pathspec then it enters it anyway because it might contain included entries. It calls the callback function before it is able to decide if the directory is actually needed. For that reason git archive adds directories to a queue and writes entries for them only when it encounters the first child item -- but currently only if pathspecs with wildcards are used. Queue *all* directories, no matter if there even are pathspecs present. This prevents git archive from writing entries for empty directories in all cases. Suggested-by: Jeff King <peff@peff.net> Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
85 lines
2.9 KiB
Bash
Executable file
85 lines
2.9 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='git archive attribute pattern tests'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_exists() {
|
|
test_expect_success " $1 exists" "test -e $1"
|
|
}
|
|
|
|
test_expect_missing() {
|
|
test_expect_success " $1 does not exist" "test ! -e $1"
|
|
}
|
|
|
|
test_expect_success 'setup' '
|
|
echo ignored >ignored &&
|
|
echo ignored export-ignore >>.git/info/attributes &&
|
|
git add ignored &&
|
|
|
|
mkdir not-ignored-dir &&
|
|
echo ignored-in-tree >not-ignored-dir/ignored &&
|
|
echo not-ignored-in-tree >not-ignored-dir/ignored-only-if-dir &&
|
|
git add not-ignored-dir &&
|
|
|
|
mkdir ignored-only-if-dir &&
|
|
echo ignored by ignored dir >ignored-only-if-dir/ignored-by-ignored-dir &&
|
|
echo ignored-only-if-dir/ export-ignore >>.git/info/attributes &&
|
|
git add ignored-only-if-dir &&
|
|
|
|
mkdir -p ignored-without-slash &&
|
|
echo "ignored without slash" >ignored-without-slash/foo &&
|
|
git add ignored-without-slash/foo &&
|
|
echo "ignored-without-slash export-ignore" >>.git/info/attributes &&
|
|
|
|
mkdir -p wildcard-without-slash &&
|
|
echo "ignored without slash" >wildcard-without-slash/foo &&
|
|
git add wildcard-without-slash/foo &&
|
|
echo "wild*-without-slash export-ignore" >>.git/info/attributes &&
|
|
|
|
mkdir -p deep/and/slashless &&
|
|
echo "ignored without slash" >deep/and/slashless/foo &&
|
|
git add deep/and/slashless/foo &&
|
|
echo "deep/and/slashless export-ignore" >>.git/info/attributes &&
|
|
|
|
mkdir -p deep/with/wildcard &&
|
|
echo "ignored without slash" >deep/with/wildcard/foo &&
|
|
git add deep/with/wildcard/foo &&
|
|
echo "deep/*t*/wildcard export-ignore" >>.git/info/attributes &&
|
|
|
|
mkdir -p one-level-lower/two-levels-lower/ignored-only-if-dir &&
|
|
echo ignored by ignored dir >one-level-lower/two-levels-lower/ignored-only-if-dir/ignored-by-ignored-dir &&
|
|
git add one-level-lower &&
|
|
|
|
git commit -m. &&
|
|
|
|
git clone --bare . bare &&
|
|
cp .git/info/attributes bare/info/attributes
|
|
'
|
|
|
|
test_expect_success 'git archive' '
|
|
git archive HEAD >archive.tar &&
|
|
(mkdir archive && cd archive && "$TAR" xf -) <archive.tar
|
|
'
|
|
|
|
test_expect_missing archive/ignored
|
|
test_expect_missing archive/not-ignored-dir/ignored
|
|
test_expect_exists archive/not-ignored-dir/ignored-only-if-dir
|
|
test_expect_exists archive/not-ignored-dir/
|
|
test_expect_missing archive/ignored-only-if-dir/
|
|
test_expect_missing archive/ignored-ony-if-dir/ignored-by-ignored-dir
|
|
test_expect_missing archive/ignored-without-slash/ &&
|
|
test_expect_missing archive/ignored-without-slash/foo &&
|
|
test_expect_missing archive/wildcard-without-slash/
|
|
test_expect_missing archive/wildcard-without-slash/foo &&
|
|
test_expect_missing archive/deep/and/slashless/ &&
|
|
test_expect_missing archive/deep/and/slashless/foo &&
|
|
test_expect_missing archive/deep/with/wildcard/ &&
|
|
test_expect_missing archive/deep/with/wildcard/foo &&
|
|
test_expect_missing archive/one-level-lower/
|
|
test_expect_missing archive/one-level-lower/two-levels-lower/ignored-only-if-dir/
|
|
test_expect_missing archive/one-level-lower/two-levels-lower/ignored-ony-if-dir/ignored-by-ignored-dir
|
|
|
|
|
|
test_done
|