* git reset --hard in .git causes a checkout in that directory
@ 2009-12-03 11:30 Maarten Lankhorst
2009-12-04 11:11 ` Jeff King
0 siblings, 1 reply; 8+ messages in thread
From: Maarten Lankhorst @ 2009-12-03 11:30 UTC (permalink / raw)
To: git
Hi all,
When I was working on my code and made a mess that I wanted to undo, I
accidentally did it in the .git directory, and had a whole clone of my
last committed tree there.
It can be triggered easily:
mkdir test; cd test; git init; touch foo; git add foo; git commit -m
'add foo'; cd .git; git reset --hard; [ -f foo ] && echo hello beauty
Other parts of git could be affected, I haven't checked where exactly
the bug hides, so I was afraid to send in a patch
Cheers,
Maarten
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git reset --hard in .git causes a checkout in that directory
2009-12-03 11:30 git reset --hard in .git causes a checkout in that directory Maarten Lankhorst
@ 2009-12-04 11:11 ` Jeff King
2009-12-04 17:25 ` Junio C Hamano
2009-12-05 19:06 ` Junio C Hamano
0 siblings, 2 replies; 8+ messages in thread
From: Jeff King @ 2009-12-04 11:11 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: Junio C Hamano, git
On Thu, Dec 03, 2009 at 12:30:46PM +0100, Maarten Lankhorst wrote:
> When I was working on my code and made a mess that I wanted to undo,
> I accidentally did it in the .git directory, and had a whole clone of
> my last committed tree there.
>
> It can be triggered easily:
>
> mkdir test; cd test; git init; touch foo; git add foo; git commit -m
> 'add foo'; cd .git; git reset --hard; [ -f foo ] && echo hello beauty
>
> Other parts of git could be affected, I haven't checked where exactly
> the bug hides, so I was afraid to send in a patch
Yuck. Thanks for the bug report. This is due to a too-loose check on my
part in 49b9362 (git-reset: refuse to do hard reset in a bare
repository, 2007-12-31).
Junio, I think the following should go to maint (I didn't bother
splitting the --merge and --hard code; --merge is in v1.6.2. I assumed
we don't care about maint releases that far back).
-- >8 --
Subject: [PATCH] reset: improve worktree safety valves
The existing code checked to make sure we were not in a bare
repository when doing a hard reset. However, we should take
this one step further, and make sure we are in a worktree.
Otherwise, we can end up munging files inside of '.git'.
Furthermore, we should do the same check for --merge resets,
which have the same properties. Actually, a merge reset of
HEAD^ would already complain, since further down in the code
we want a worktree. However, it is nicer to check up-front;
then we are sure we cover all cases ("git reset --merge"
would run, even though it wasn't doing anything) and we can
give a more specific message.
Signed-off-by: Jeff King <peff@peff.net>
---
builtin-reset.c | 6 ++++--
t/t7103-reset-bare.sh | 14 ++++++++++++++
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/builtin-reset.c b/builtin-reset.c
index 73e6022..11d1c6e 100644
--- a/builtin-reset.c
+++ b/builtin-reset.c
@@ -286,8 +286,10 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
if (reset_type == NONE)
reset_type = MIXED; /* by default */
- if (reset_type == HARD && is_bare_repository())
- die("hard reset makes no sense in a bare repository");
+ if ((reset_type == HARD || reset_type == MERGE)
+ && !is_inside_work_tree())
+ die("%s reset requires a work tree",
+ reset_type_names[reset_type]);
/* Soft reset does not touch the index file nor the working tree
* at all, but requires them in a good order. Other resets reset
diff --git a/t/t7103-reset-bare.sh b/t/t7103-reset-bare.sh
index 42bf518..3ddf0ac 100755
--- a/t/t7103-reset-bare.sh
+++ b/t/t7103-reset-bare.sh
@@ -11,6 +11,16 @@ test_expect_success 'setup non-bare' '
git commit -a -m two
'
+test_expect_success 'hard reset requires a worktree' '
+ (cd .git &&
+ test_must_fail git reset --hard)
+'
+
+test_expect_success 'merge reset requires a worktree' '
+ (cd .git &&
+ test_must_fail git reset --merge)
+'
+
test_expect_success 'setup bare' '
git clone --bare . bare.git &&
cd bare.git
@@ -20,6 +30,10 @@ test_expect_success 'hard reset is not allowed' '
test_must_fail git reset --hard HEAD^
'
+test_expect_success 'merge reset is not allowed' '
+ test_must_fail git reset --merge HEAD^
+'
+
test_expect_success 'soft reset is allowed' '
git reset --soft HEAD^ &&
test "`git show --pretty=format:%s | head -n 1`" = "one"
--
1.6.6.rc1.18.ga777f.dirty
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: git reset --hard in .git causes a checkout in that directory
2009-12-04 11:11 ` Jeff King
@ 2009-12-04 17:25 ` Junio C Hamano
2009-12-05 18:24 ` Junio C Hamano
2009-12-05 19:06 ` Junio C Hamano
1 sibling, 1 reply; 8+ messages in thread
From: Junio C Hamano @ 2009-12-04 17:25 UTC (permalink / raw)
To: Jeff King; +Cc: Maarten Lankhorst, Junio C Hamano, git
Jeff King <peff@peff.net> writes:
> Junio, I think the following should go to maint (I didn't bother
> splitting the --merge and --hard code; --merge is in v1.6.2. I assumed
> we don't care about maint releases that far back).
Thanks. The test already checks that the change won't break soft reset,
which is good, but it does not seem to check/specify what should happen in
the mixed reset in this case (I think it should be allowed). Could you
add one while at it?
> diff --git a/t/t7103-reset-bare.sh b/t/t7103-reset-bare.sh
> index 42bf518..3ddf0ac 100755
> --- a/t/t7103-reset-bare.sh
> +++ b/t/t7103-reset-bare.sh
> @@ -11,6 +11,16 @@ test_expect_success 'setup non-bare' '
> git commit -a -m two
> '
>
> +test_expect_success 'hard reset requires a worktree' '
> + (cd .git &&
> + test_must_fail git reset --hard)
> +'
> +
> +test_expect_success 'merge reset requires a worktree' '
> + (cd .git &&
> + test_must_fail git reset --merge)
> +'
> +
> test_expect_success 'setup bare' '
> git clone --bare . bare.git &&
> cd bare.git
> @@ -20,6 +30,10 @@ test_expect_success 'hard reset is not allowed' '
> test_must_fail git reset --hard HEAD^
> '
>
> +test_expect_success 'merge reset is not allowed' '
> + test_must_fail git reset --merge HEAD^
> +'
> +
> test_expect_success 'soft reset is allowed' '
> git reset --soft HEAD^ &&
> test "`git show --pretty=format:%s | head -n 1`" = "one"
> --
> 1.6.6.rc1.18.ga777f.dirty
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git reset --hard in .git causes a checkout in that directory
2009-12-04 17:25 ` Junio C Hamano
@ 2009-12-05 18:24 ` Junio C Hamano
2009-12-06 4:15 ` Jeff King
0 siblings, 1 reply; 8+ messages in thread
From: Junio C Hamano @ 2009-12-05 18:24 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Jeff King, Maarten Lankhorst, git
Junio C Hamano <gitster@pobox.com> writes:
> ... The test already checks that the change won't break soft reset,
> which is good, but it does not seem to check/specify what should happen in
> the mixed reset in this case (I think it should be allowed).
Heh, I was not thinking straight. A bare repository does not have the
index, so allowing (cd .git && git reset) is Ok but mixed in a bare
repository (cd bare.git && git reset) is not.
Let's cover a few more missing cases.
t/t7103-reset-bare.sh | 20 ++++++++++++++++----
1 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/t/t7103-reset-bare.sh b/t/t7103-reset-bare.sh
index 3ddf0ac..68041df 100755
--- a/t/t7103-reset-bare.sh
+++ b/t/t7103-reset-bare.sh
@@ -21,20 +21,32 @@ test_expect_success 'merge reset requires a worktree' '
test_must_fail git reset --merge)
'
+test_expect_success 'mixed reset is ok' '
+ (cd .git && git reset)
+'
+
+test_expect_success 'soft reset is ok' '
+ (cd .git && git reset --soft)
+'
+
test_expect_success 'setup bare' '
git clone --bare . bare.git &&
cd bare.git
'
-test_expect_success 'hard reset is not allowed' '
- test_must_fail git reset --hard HEAD^
+test_expect_success 'hard reset is not allowed in bare' '
+ test_must_fail git reset --hard HEAD^
'
-test_expect_success 'merge reset is not allowed' '
+test_expect_success 'merge reset is not allowed in bare' '
test_must_fail git reset --merge HEAD^
'
-test_expect_success 'soft reset is allowed' '
+test_expect_success 'mixed reset is not allowed in bare' '
+ test_must_fail git reset --mixed HEAD^
+'
+
+test_expect_success 'soft reset is allowed in bare' '
git reset --soft HEAD^ &&
test "`git show --pretty=format:%s | head -n 1`" = "one"
'
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: git reset --hard in .git causes a checkout in that directory
2009-12-04 11:11 ` Jeff King
2009-12-04 17:25 ` Junio C Hamano
@ 2009-12-05 19:06 ` Junio C Hamano
2009-12-06 4:18 ` Jeff King
1 sibling, 1 reply; 8+ messages in thread
From: Junio C Hamano @ 2009-12-05 19:06 UTC (permalink / raw)
To: Jeff King; +Cc: Maarten Lankhorst, Junio C Hamano, git
Jeff King <peff@peff.net> writes:
> On Thu, Dec 03, 2009 at 12:30:46PM +0100, Maarten Lankhorst wrote:
>
>> When I was working on my code and made a mess that I wanted to undo,
>> I accidentally did it in the .git directory, and had a whole clone of
>> my last committed tree there.
>>
>> It can be triggered easily:
>>
>> mkdir test; cd test; git init; touch foo; git add foo; git commit -m
>> 'add foo'; cd .git; git reset --hard; [ -f foo ] && echo hello beauty
>>
>> Other parts of git could be affected, I haven't checked where exactly
>> the bug hides, so I was afraid to send in a patch
>
> Yuck. Thanks for the bug report. This is due to a too-loose check on my
> part in 49b9362 (git-reset: refuse to do hard reset in a bare
> repository, 2007-12-31).
>
> Junio, I think the following should go to maint (I didn't bother
> splitting the --merge and --hard code; --merge is in v1.6.2. I assumed
> we don't care about maint releases that far back).
Although I'll apply your patch to 'maint' and will merge it for 1.6.6, I
am not quite sure if this is the best fix in the longer run. Shouldn't we
go back to the top of the work tree and running what was asked there?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git reset --hard in .git causes a checkout in that directory
2009-12-05 18:24 ` Junio C Hamano
@ 2009-12-06 4:15 ` Jeff King
0 siblings, 0 replies; 8+ messages in thread
From: Jeff King @ 2009-12-06 4:15 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Maarten Lankhorst, git
On Sat, Dec 05, 2009 at 10:24:46AM -0800, Junio C Hamano wrote:
> > ... The test already checks that the change won't break soft reset,
> > which is good, but it does not seem to check/specify what should happen in
> > the mixed reset in this case (I think it should be allowed).
>
> Heh, I was not thinking straight. A bare repository does not have the
> index, so allowing (cd .git && git reset) is Ok but mixed in a bare
> repository (cd bare.git && git reset) is not.
Hmm. I would have thought it would be allowed in a bare repository, to
explicitly let people treat the bare repo as a pseudo-database, just
pulling out the files when they want to. And I was all set to argue
against restricting it, but looking at your tests, it seems we already
disallow it. So I don't see a harm in verifying the current behavior.
-Peff
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git reset --hard in .git causes a checkout in that directory
2009-12-05 19:06 ` Junio C Hamano
@ 2009-12-06 4:18 ` Jeff King
2009-12-06 7:54 ` Junio C Hamano
0 siblings, 1 reply; 8+ messages in thread
From: Jeff King @ 2009-12-06 4:18 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Maarten Lankhorst, git
On Sat, Dec 05, 2009 at 11:06:02AM -0800, Junio C Hamano wrote:
> > Junio, I think the following should go to maint (I didn't bother
> > splitting the --merge and --hard code; --merge is in v1.6.2. I assumed
> > we don't care about maint releases that far back).
>
> Although I'll apply your patch to 'maint' and will merge it for 1.6.6, I
> am not quite sure if this is the best fix in the longer run. Shouldn't we
> go back to the top of the work tree and running what was asked there?
I actually considered that, too, when writing the patch. But that would
be inconsistent with all of the other commands that use SETUP_WORK_TREE.
For example:
$ git init && cd .git && git clean
fatal: This operation must be run in a work tree
So I think we are better to be consistent with the other commands. If
somebody wants to make a separate patch to discover the work tree while
in the $GIT_DIR and chdir to it, that should then be applied to all
commands. I'm not opposed to it, but I also don't see it as a
particularly pressing need.
-Peff
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git reset --hard in .git causes a checkout in that directory
2009-12-06 4:18 ` Jeff King
@ 2009-12-06 7:54 ` Junio C Hamano
0 siblings, 0 replies; 8+ messages in thread
From: Junio C Hamano @ 2009-12-06 7:54 UTC (permalink / raw)
To: Jeff King; +Cc: Maarten Lankhorst, git
Jeff King <peff@peff.net> writes:
> I actually considered that, too, when writing the patch. But that would
> be inconsistent with all of the other commands that use SETUP_WORK_TREE.
> For example:
>
> $ git init && cd .git && git clean
> fatal: This operation must be run in a work tree
>
> So I think we are better to be consistent with the other commands. If
> somebody wants to make a separate patch to discover the work tree while
> in the $GIT_DIR and chdir to it, that should then be applied to all
> commands. I'm not opposed to it, but I also don't see it as a
> particularly pressing need.
Yes, we would of course want to do this consistently. I haven't followed
the codepath yet, but I suspect this will end up being connected with
running "rev-parse --show-cdup" inside .git/ of a non-bare repository.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-12-06 7:54 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-03 11:30 git reset --hard in .git causes a checkout in that directory Maarten Lankhorst
2009-12-04 11:11 ` Jeff King
2009-12-04 17:25 ` Junio C Hamano
2009-12-05 18:24 ` Junio C Hamano
2009-12-06 4:15 ` Jeff King
2009-12-05 19:06 ` Junio C Hamano
2009-12-06 4:18 ` Jeff King
2009-12-06 7:54 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).