Re: [PATCH] unpack-trees: do not delete i-t-a entries in worktree even when forced
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 24, 2016, 22:57 UTC
- Message-ID
- <xmqqa8mpsom6.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <1456314317-30301-1-git-send-email-pclouds@gmail.com>
Nguyễn Thái Ngọc Duy <pclouds@gmail.com> 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).
Show 47 quoted lines
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> 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;