commit: ignore intent-to-add entries instead of refusing
authorJunio C Hamano <gitster@pobox.com>
Tue, 7 Feb 2012 19:55:48 +0000 (11:55 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 7 Feb 2012 20:14:40 +0000 (12:14 -0800)
commit3f6d56de5f99ec5f0667bef4411f2515b253a5b2
tree990ae505d933eea5b9db752ea5f1481372140520
parentf174a2583c9f42315b60205890fa67a79a1f1669
commit: ignore intent-to-add entries instead of refusing

Originally, "git add -N" was introduced to help users from forgetting to
add new files to the index before they ran "git commit -a".  As an attempt
to help them further so that they do not forget to say "-a", "git commit"
to commit the index as-is was taught to error out, reminding the user that
they may have forgotten to add the final contents of the paths before
running the command.

This turned out to be a false "safety" that is useless.  If the user made
changes to already tracked paths and paths added with "git add -N", and
then ran "git add" to register the final contents of the paths added with
"git add -N", "git commit" will happily create a commit out of the index,
without including the local changes made to the already tracked paths. It
was not a useful "safety" measure to prevent "forgetful" mistakes from
happening.

It turns out that this behaviour is not just a useless false "safety", but
actively hurts use cases of "git add -N" that were discovered later and
have become popular, namely, to tell Git to be aware of these paths added
by "git add -N", so that commands like "git status" and "git diff" would
include them in their output, even though the user is not interested in
including them in the next commit they are going to make.

Fix this ancient UI mistake, and instead make a commit from the index
ignoring the paths added by "git add -N" without adding real contents.

Based on the work by Nguyễn Thái Ngọc Duy, and helped by injection of
sanity from Jonathan Nieder and others on the Git mailing list.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache-tree.c
t/t2203-add-intent.sh