From: Junio C Hamano <gitster@pobox.com>
To: "Shawn O. Pearce" <spearce@spearce.org>
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>, git@vger.kernel.org
Subject: [PATCH 1/3] builtin-rm.c: explain and clarify the "local change" logic
Date: Fri, 28 Nov 2008 19:51:58 -0800 [thread overview]
Message-ID: <7vvdu72nq9.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: 7vk5an4cba.fsf_-_@gitster.siamese.dyndns.org
Explain the logic to check local modification a bit more in the comment,
especially because the existing comment that talks about "git rm --cached"
was placed in a part that was not about "--cached" at all.
Also clarify "if .. else if .." structure.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
* This is the first patch of a re-rolled sesries of the previous one, and
again applies to the master plus the first commit from nd/narrow.
builtin-rm.c | 53 ++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/builtin-rm.c b/builtin-rm.c
index b7126e3..3d03da0 100644
--- a/builtin-rm.c
+++ b/builtin-rm.c
@@ -31,7 +31,8 @@ static void add_list(const char *name)
static int check_local_mod(unsigned char *head, int index_only)
{
- /* items in list are already sorted in the cache order,
+ /*
+ * Items in list are already sorted in the cache order,
* so we could do this a lot more efficiently by using
* tree_desc based traversal if we wanted to, but I am
* lazy, and who cares if removal of files is a tad
@@ -71,25 +72,55 @@ static int check_local_mod(unsigned char *head, int index_only)
*/
continue;
}
+
+ /*
+ * "rm" of a path that has changes need to be treated
+ * carefully not to allow losing local changes
+ * accidentally. A local change could be (1) file in
+ * work tree is different since the index; and/or (2)
+ * the user staged a content that is different from
+ * the current commit in the index.
+ *
+ * In such a case, you would need to --force the
+ * removal. However, "rm --cached" (remove only from
+ * the index) is safe if the index matches the file in
+ * the work tree or the HEAD commit, as it means that
+ * the content being removed is available elsewhere.
+ */
+
+ /*
+ * Is the index different from the file in the work tree?
+ */
if (ce_match_stat(ce, &st, 0))
local_changes = 1;
+
+ /*
+ * Is the index different from the HEAD commit? By
+ * definition, before the very initial commit,
+ * anything staged in the index is treated by the same
+ * way as changed from the HEAD.
+ */
if (no_head
|| get_tree_entry(head, name, sha1, &mode)
|| ce->ce_mode != create_ce_mode(mode)
|| hashcmp(ce->sha1, sha1))
staged_changes = 1;
- if (local_changes && staged_changes &&
- !(index_only && is_empty_blob_sha1(ce->sha1)))
- errs = error("'%s' has staged content different "
- "from both the file and the HEAD\n"
- "(use -f to force removal)", name);
+ /*
+ * If the index does not match the file in the work
+ * tree and if it does not match the HEAD commit
+ * either, (1) "git rm" without --cached definitely
+ * will lose information; (2) "git rm --cached" will
+ * lose information unless it is about removing an
+ * "intent to add" entry.
+ */
+ if (local_changes && staged_changes) {
+ if (!index_only || !is_empty_blob_sha1(ce->sha1))
+ errs = error("'%s' has staged content different "
+ "from both the file and the HEAD\n"
+ "(use -f to force removal)", name);
+ }
else if (!index_only) {
- /* It's not dangerous to "git rm --cached" a
- * file if the index matches the file or the
- * HEAD, since it means the deleted content is
- * still available somewhere.
- */
if (staged_changes)
errs = error("'%s' has changes staged in the index\n"
"(use --cached to keep the file, "
--
1.6.0.4.850.g6bd829
next prev parent reply other threads:[~2008-11-29 3:58 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-27 0:28 What's cooking in git.git (Nov 2008, #06; Wed, 26) Junio C Hamano
2008-11-27 22:49 ` Johannes Schindelin
2008-11-28 2:06 ` Junio C Hamano
2008-11-28 11:47 ` Johannes Schindelin
2008-11-28 19:20 ` Shawn O. Pearce
2008-11-29 0:13 ` Junio C Hamano
2008-11-29 0:15 ` [PATCH] git add --intent-to-add: fix removal of cached emptiness Junio C Hamano
2008-11-29 3:51 ` Junio C Hamano [this message]
2008-11-29 3:55 ` [PATCH 2/3] " Junio C Hamano
2008-11-29 15:38 ` Sverre Rabbelier
2008-11-30 19:21 ` Jeff King
2008-11-29 3:56 ` [PATCH 3/3] git add --intent-to-add: do not let an empty blob committed by accident Junio C Hamano
2008-11-30 19:14 ` Jeff King
2008-12-01 9:24 ` Junio C Hamano
2008-11-29 1:25 ` What's cooking in git.git (Nov 2008, #06; Wed, 26) Daniel Barkalow
2008-11-29 13:02 ` Nguyen Thai Ngoc Duy
2008-11-30 10:29 ` Nguyen Thai Ngoc Duy
2008-11-30 21:26 ` Daniel Barkalow
2008-12-06 17:26 ` Nguyen Thai Ngoc Duy
2008-12-06 18:39 ` Daniel Barkalow
2008-12-07 12:27 ` Nguyen Thai Ngoc Duy
2008-12-07 21:26 ` Daniel Barkalow
2008-12-08 12:51 ` Nguyen Thai Ngoc Duy
2008-12-08 19:41 ` Daniel Barkalow
2008-12-11 13:04 ` Nguyen Thai Ngoc Duy
2008-12-11 20:30 ` Daniel Barkalow
2008-12-12 1:41 ` Junio C Hamano
2008-12-12 2:40 ` Daniel Barkalow
2008-12-12 3:12 ` Junio C Hamano
2008-12-12 3:36 ` Jeff King
2008-12-12 16:13 ` Nguyen Thai Ngoc Duy
2008-12-12 16:45 ` Johannes Sixt
2008-12-12 16:54 ` Nguyen Thai Ngoc Duy
2008-12-13 5:51 ` Junio C Hamano
2008-12-13 5:51 ` Junio C Hamano
2008-12-12 16:08 ` Nguyen Thai Ngoc Duy
2008-12-07 3:45 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7vvdu72nq9.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.