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. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- 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_done diff --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; -- 2.7.2.531.gc9e018c -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html