Hi *,
when you try removing a newly added file it success and removes the
file from the working directory. So if you do:
$ echo "newly added file" > new
$ git add new
$ git rm new
the file "new" is lost, it is not in the index, neither in HEAD. At
this moment the only way to recover the file new is searching for
unreachable objects. (Am I missing something?)
I think that the "git rm new" should remove "new" from the index or
should fail, maybe with:
$ git rm new
error: 'new' is not in HEAD (hint: try --cached)
Santi
Given this set of commands:
$ echo "newly added file" >new
$ git add new
$ git rm new
the file "new" was previously removed from the working
directory and the index. Because it was not in HEAD, it is
available only by searching for unreachable objects.
Instead, we now err on the safe side and refuse to remove
a file which is not referenced by HEAD.
Signed-off-by: Jeff King <redacted>
---
I think that the "git rm new" should remove "new" from the index or
should fail, maybe with:
Something like this?
I think there are still some issues with the safety valve, though; this
triggers on 'git rm --cached new' which should be a perfectly safe
operation. However, that is not new to this change; we already
erroneously trigger the valve on a --cached removal of a file with
matching index and working directory, but mismatch with HEAD. Example:
git-add foo
git-commit -m 'added foo'
echo changes >>foo
git-add foo
git-rm --cached foo ;# should be OK because we have working copy
I think the logic for "safe to remove" and "safe to remove --cached"
needs to be separate. I will take a look.
Also, this just implements "error, try -f" when it would be safe to drop
back to --cached for that file. Is there any interest in trying to make
git-rm more clever in this way, or is simple and predictable preferred?
builtin-rm.c | 18 ++++--------------
1 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/builtin-rm.c b/builtin-rm.c
index 00dbe39..bf42003 100644
--- a/builtin-rm.c
+++ b/builtin-rm.c
@@ -89,20 +89,10 @@ static int check_local_mod(unsigned char *head)
if (ce_match_stat(ce, &st, 0))
errs = error("'%s' has local modifications "
"(hint: try -f)", ce->name);
- if (no_head)
- continue;
- /*
- * It is Ok to remove a newly added path, as long as
- * it is cache-clean.
- */
- if (get_tree_entry(head, name, sha1, &mode))
- continue;
- /*
- * Otherwise make sure the version from the HEAD
- * matches the index.
- */
- if (ce->ce_mode != create_ce_mode(mode) ||
- hashcmp(ce->sha1, sha1))
+ if (no_head
+ || get_tree_entry(head, name, sha1, &mode)
+ || ce->ce_mode != create_ce_mode(mode)
+ || hashcmp(ce->sha1, sha1))
errs = error("'%s' has changes staged in the index "
"(hint: try -f)", name);
}--
1.5.1.rc2.615.g992d-dirty