Skip to content

Commit 3f6d56d

Browse files
committed
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 <[email protected]>
1 parent f174a25 commit 3f6d56d

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

cache-tree.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ static int verify_cache(struct cache_entry **cache,
158158
funny = 0;
159159
for (i = 0; i < entries; i++) {
160160
struct cache_entry *ce = cache[i];
161-
if (ce_stage(ce) || (ce->ce_flags & CE_INTENT_TO_ADD)) {
161+
if (ce_stage(ce)) {
162162
if (10 < ++funny) {
163163
fprintf(stderr, "...\n");
164164
break;
@@ -336,8 +336,8 @@ static int update_one(struct cache_tree *it,
336336
mode, sha1_to_hex(sha1), entlen+baselen, path);
337337
}
338338

339-
if (ce->ce_flags & CE_REMOVE)
340-
continue; /* entry being removed */
339+
if (ce->ce_flags & (CE_REMOVE | CE_INTENT_TO_ADD))
340+
continue; /* entry being removed or placeholder */
341341

342342
strbuf_grow(&buffer, entlen + 100);
343343
strbuf_addf(&buffer, "%o %.*s%c", mode, entlen, path + baselen, '\0');

t/t2203-add-intent.sh

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ test_expect_success 'intent to add does not clobber existing paths' '
3232
! grep "$empty" actual
3333
'
3434

35-
test_expect_success 'cannot commit with i-t-a entry' '
35+
test_expect_success 'i-t-a entry is simply ignored' '
3636
test_tick &&
3737
git commit -a -m initial &&
3838
git reset --hard &&
@@ -41,12 +41,14 @@ test_expect_success 'cannot commit with i-t-a entry' '
4141
echo frotz >nitfol &&
4242
git add rezrov &&
4343
git add -N nitfol &&
44-
test_must_fail git commit -m initial
44+
git commit -m second &&
45+
test $(git ls-tree HEAD -- nitfol | wc -l) = 0 &&
46+
test $(git diff --name-only HEAD -- nitfol | wc -l) = 1
4547
'
4648

4749
test_expect_success 'can commit with an unrelated i-t-a entry in index' '
4850
git reset --hard &&
49-
echo xyzzy >rezrov &&
51+
echo bozbar >rezrov &&
5052
echo frotz >nitfol &&
5153
git add rezrov &&
5254
git add -N nitfol &&

0 commit comments

Comments
 (0)