git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] git add --intent-to-add: fix removal of cached emptiness

From
Junio C Hamano <gitster@pobox.com>
Date
Nov 29, 2008, 03:55 UTC
Message-ID
<7vprkf2nki.fsf_-_@gitster.siamese.dyndns.org>
In-Reply-To
<7vvdu72nq9.fsf@gitster.siamese.dyndns.org>

This uses the extended index flag mechanism introduced earlier to mark the entries added to the index via "git add -N" with CE_INTENT_TO_ADD.

The logic to detect an "intent to add" entry for the purpose of allowing "git rm --cached $path" is tightened to check not just for a staged empty blob, but with the CE_INTENT_TO_ADD bit. This protects an empty blob that was explicitly added and then modified in the work tree from being dropped with this sequence:

	$ >empty
	$ git add empty
	$ echo "non empty" >empty
	$ git rm --cached empty
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin-rm.c  |    2 +-
 cache.h       |    3 ++-
 read-cache.c  |    2 ++
 t/t3600-rm.sh |    4 ++--
 4 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/builtin-rm.c b/builtin-rm.c
index 3d03da0..c11f455 100644
--- a/builtin-rm.c
+++ b/builtin-rm.c
@@ -115,7 +115,7 @@ static int check_local_mod(unsigned char *head, int index_only)
 		 * "intent to add" entry.
 		 */
 		if (local_changes && staged_changes) {
-			if (!index_only || !is_empty_blob_sha1(ce->sha1))
+			if (!index_only || !(ce->ce_flags & CE_INTENT_TO_ADD))
 				errs = error("'%s' has staged content different "
 					     "from both the file and the HEAD\n"
 					     "(use -f to force removal)", name);
diff --git a/cache.h b/cache.h
index ef2e7f9..f15b3fc 100644
--- a/cache.h
+++ b/cache.h
@@ -176,10 +176,11 @@ struct cache_entry {
 /*
  * Extended on-disk flags
  */
+#define CE_INTENT_TO_ADD 0x20000000
 /* CE_EXTENDED2 is for future extension */
 #define CE_EXTENDED2 0x80000000
 
-#define CE_EXTENDED_FLAGS (0)
+#define CE_EXTENDED_FLAGS (CE_INTENT_TO_ADD)
 
 /*
  * Safeguard to avoid saving wrong flags:
diff --git a/read-cache.c b/read-cache.c
index abc627b..fa30a0f 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -546,6 +546,8 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
 	ce->ce_flags = namelen;
 	if (!intent_only)
 		fill_stat_cache_info(ce, st);
+	else
+		ce->ce_flags |= CE_INTENT_TO_ADD;
 
 	if (trust_executable_bit && has_symlinks)
 		ce->ce_mode = create_ce_mode(st_mode);
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 5b4d6f7..b7d46e5 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -187,8 +187,8 @@ test_expect_success 'but with -f it should work.' '
 	test_must_fail git ls-files --error-unmatch baz
 '
 
-test_expect_failure 'refuse to remove cached empty file with modifications' '
-	touch empty &&
+test_expect_success 'refuse to remove cached empty file with modifications' '
+	>empty &&
 	git add empty &&
 	echo content >empty &&
 	test_must_fail git rm --cached empty
-- 
1.6.0.4.850.g6bd829
Previous: Junio C HamanoNext: Sverre Rabbelier
Message 9 of 37 in “What's cooking in git.git (Nov 2008, #06; Wed, 26)”
  1. Junio C HamanoNov 27, 2008
  2. Johannes SchindelinNov 27, 2008
  3. Junio C HamanoNov 28, 2008
  4. Johannes SchindelinNov 28, 2008
  5. Shawn O. PearceNov 28, 2008
  6. Junio C HamanoNov 29, 2008
  7. git add --intent-to-add: fix removal of cached emptinessJunio C Hamano, Nov 29, 2008
  8. 1/3 builtin-rm.c: explain and clarify the "local change" logicJunio C Hamano, Nov 29, 2008
  9. 2/3 git add --intent-to-add: fix removal of cached emptinessJunio C Hamano, Nov 29, 2008
  10. Sverre RabbelierNov 29, 2008
  11. Jeff KingNov 30, 2008
  12. 3/3 git add --intent-to-add: do not let an empty blob committed by accidentJunio C Hamano, Nov 29, 2008
  13. Jeff KingNov 30, 2008
  14. Junio C HamanoDec 1, 2008
  15. Daniel BarkalowNov 29, 2008
  16. Nguyen Thai Ngoc DuyNov 29, 2008
  17. Nguyen Thai Ngoc DuyNov 30, 2008
  18. Daniel BarkalowNov 30, 2008
  19. Nguyen Thai Ngoc DuyDec 6, 2008
  20. Daniel BarkalowDec 6, 2008
  21. Nguyen Thai Ngoc DuyDec 7, 2008
  22. Daniel BarkalowDec 7, 2008
  23. Nguyen Thai Ngoc DuyDec 8, 2008
  24. Daniel BarkalowDec 8, 2008
  25. Nguyen Thai Ngoc DuyDec 11, 2008
  26. Daniel BarkalowDec 11, 2008
  27. Junio C HamanoDec 12, 2008
  28. Daniel BarkalowDec 12, 2008
  29. Junio C HamanoDec 12, 2008
  30. Jeff KingDec 12, 2008
  31. Nguyen Thai Ngoc DuyDec 12, 2008
  32. Johannes SixtDec 12, 2008
  33. Nguyen Thai Ngoc DuyDec 12, 2008
  34. Junio C HamanoDec 13, 2008
  35. Junio C HamanoDec 13, 2008
  36. Nguyen Thai Ngoc DuyDec 12, 2008
  37. Junio C HamanoDec 7, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.