Thread (67 messages) 67 messages, 4 authors, 2019-10-07

Re: [PATCH] t7300-clean: demonstrate deleting nested repo with an ignored file breakage

From: SZEDER Gábor <hidden>
Date: 2019-08-26 07:48:47

On Sun, Aug 25, 2019 at 11:32:28PM +0100, Philip Oakley wrote:
Hi Szeder,

On 25/08/2019 19:59, SZEDER Gábor wrote:
quoted
'git clean -fd' must not delete an untracked directory if it belongs
s/untracked//
I don't believe it should matter either way for a sub-module
(sub-directory).
I just paraphrased the documentation of the '-d' option for a bit of
context.

   Remove untracked directories in addition to untracked files. If an
   untracked directory is managed by a different Git repository, it is
   not removed by default. Use -f option twice if you really want to
   remove such a directory.
quoted
to a different Git repository or worktree.
msybr split the assertion from the fault explanation.
quoted
 Unfortunately, if a
'.gitignore' rule in the outer repository happens to match a file in a
nested repository or worktree, then something goes awry and 'git clean
-fd' does delete the content of the nested repository's worktree
good so far.
quoted
except that ignored file, potentially leading to data loss.
this appears at cross purposes as the description has changed from
'ignored/untracked directory' to 'ignored file'.
The description does not mention any ignored directories.
I'm not sure which part the
data loss is meant to refer to.
Well, there is only one part where the description talks about stuff
getting deleted... and that's what it refers to :)
quoted
Add a test to 't7300-clean.sh' to demonstrate this breakage.

This issue is a regression introduced in 6b1db43109 (clean: teach
clean -d to preserve ignored paths, 2017-05-23).

Signed-off-by: SZEDER Gábor <redacted>
---
On a related note, 'git clean -fdx' does leave the nested repository
or worktree intact in the same situation, as it should.
quoted
 t/t7300-clean.sh | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index a2c45d1902..d01fd120ab 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh
@@ -669,6 +669,28 @@ test_expect_success 'git clean -d skips untracked dirs containing ignored files'
 	test_path_is_missing foo/b/bb
 '
+test_expect_failure 'git clean -d skips nested repo containing ignored files' '
+	test_when_finished "rm -rf nested-repo-with-ignored-file" &&
+
+	git init nested-repo-with-ignored-file &&
+	(
+		cd nested-repo-with-ignored-file &&
+		>file &&
+		git add file &&
+		git commit -m Initial &&
+
+		# This file is ignored by a .gitignore rule in the outer repo
+		# added in the previous test.
+		>ignoreme
+	) &&
+
+	git clean -fd &&
+
+	test_path_is_file nested-repo-with-ignored-file/.git/index &&
+	test_path_is_file nested-repo-with-ignored-file/ignoreme &&
+	test_path_is_file nested-repo-with-ignored-file/file
+'
+
 test_expect_success MINGW 'handle clean & core.longpaths = false nicely' '
 	test_config core.longpaths false &&
 	a50=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help