Re: [PATCH] unpack-trees: do not delete i-t-a entries in worktree even when forced
From: Junio C Hamano <hidden>
Date: 2016-06-15 23:08:25
Nguyễn Thái Ngọc Duy [off-list ref] writes:
Intent-to-add entries are basically "I may want to commit these files later, but for now they are untracked". As such, when the user does "git reset --hard <tree>", which removes i-t-a entries from the index, i-t-a entries in worktree should be kept as untracked.
Hmm, I can see that the control flow of "reset --hard" for an i-t-a path does pass through this function, but it is not very obvious to see how this will not negatively affect other uses of the unpack-trees machinery (e.g. "checkout" and "merge", especially when such a path needs to turn into a directory by getting removed).
quoted hunk
Signed-off-by: Nguyễn Thái Ngọc Duy <redacted> --- Lost two files today, luckily I had a backup. t/t2203-add-intent.sh | 15 +++++++++++++++ unpack-trees.c | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-)diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh index 2a4a749..63086bf 100755 --- a/t/t2203-add-intent.sh +++ b/t/t2203-add-intent.sh@@ -82,5 +82,20 @@ test_expect_success 'cache-tree invalidates i-t-a paths' ' test_cmp expect actual ' +test_expect_success 'reset --hard leaves on-disk ita entries alone' ' + git init keep-ita && + ( + cd keep-ita && + echo abc >abc && + echo def >def && + git add abc && + git commit -m abc && + git add -N def && + git reset --hard HEAD && + echo def >expected && + test_cmp expected def + ) +' + test_donediff --git a/unpack-trees.c b/unpack-trees.c index 9f55cc2..1a2271b 100644 --- a/unpack-trees.c +++ b/unpack-trees.c@@ -104,7 +104,7 @@ static int do_add_entry(struct unpack_trees_options *o, struct cache_entry *ce, { clear |= CE_HASHED; - if (set & CE_REMOVE) + if ((set & CE_REMOVE) && !ce_intent_to_add(ce)) set |= CE_WT_REMOVE; ce->ce_flags = (ce->ce_flags & ~clear) | set;