threads / bug / 46447

Bug^Feature? fetch protects only current working tree branch

Subject: Bug^Feature? fetch protects only current working tree branch

## tl;dr

3 messages between Jul 23, 2017 and Jul 24, 2017.

replies: 2people: 2as markdown or json

Andreas Heiduk· Jul 23, 2017, 14:50 UTC · lore

A `git fetch . origin/master:master` protects the currently checked out branch (HEAD) unless the `-u/--update-head-ok` is supplied. This avoids a mismatch between the index and HEAD. BUT branches which are HEADs in other working trees do not get that care - their state is silently screwed up.

Is this intended behaviour or and just an oversight while implementing `git worktree`?

Steps to reproduce
    # setup
    git clone -b master $SOMETHING xtemp
    cd xtemp
    git reset --hard HEAD~5 # pretend to be back some time
    git worktree add ../xtemp-wt1
    git worktree add ../xtemp-wt2
    # test
    git fetch . origin/master:master
    
        fatal: Refusing to fetch into current branch refs/heads/master  of non-bare repository
        fatal: The remote end hung up unexpectedly
    # OK, current working tree is protected, try another one:
    git fetch . origin/master:xtemp-wt1
        From .
           b4d1278..6e7b60d  origin/master -> xtemp-wt1
    cd ../xtemp-wt1
    git status
        # admire messed up working tree here
    # The protection is really "current working tree", not "first/main working tree"!
    git fetch . origin/master:master
        From .
           b4d1278..6e7b60d  origin/master -> master
    cd ../xtemp
    git status
        # now it's messed up here too
    # Try with "--update-head-ok" but check first.
    cd ../xtemp-wt2
    git fetch . origin/master:xtemp-wt2
        fatal: Refusing to fetch into current branch refs/heads/xtemp-wt2 of non-bare repository
        fatal: The remote end hung up unexpectedly
    git fetch --update-head-ok . origin/master:xtemp-wt2
        
        From .
           b4d1278..6e7b60d  origin/master -> xtemp-wt2
Junio C Hamano· Jul 23, 2017, 22:13 UTC · re: Andreas Heiduk · lore

Re: Bug^Feature? fetch protects only current working tree branch

Andreas Heiduk <andreas.heiduk@mathema.de> writes:
Show 7 quoted lines
> A `git fetch . origin/master:master` protects the currently checked out 
> branch (HEAD) unless the `-u/--update-head-ok` is supplied. This avoids a
> mismatch between the index and HEAD. BUT branches which are HEADs in other
> working trees do not get that care - their state is silently screwed up.
>
> Is this intended behaviour or and just an oversight while implementing
> `git worktree`?

The latter. "git worktree" is an interesting feature and has potential to become useful in wider variety of workflows than it currently is, but end users should consider it still experimental as it still is with many such small rough edges like this one.

Patches to help improving the feature is of course very welcome.
Andreas Heiduk· Jul 24, 2017, 21:51 UTC · re: Junio C Hamano · lore

Re: Bug^Feature? fetch protects only current working tree branch

Am 24.07.2017 um 00:13 schrieb Junio C Hamano:
Show 11 quoted lines
> Andreas Heiduk <andreas.heiduk@mathema.de> writes:
> 
>> A `git fetch . origin/master:master` protects the currently checked out 
>> branch (HEAD) unless the `-u/--update-head-ok` is supplied. This avoids a
>> mismatch between the index and HEAD. BUT branches which are HEADs in other
>> working trees do not get that care - their state is silently screwed up.
>>
>> Is this intended behaviour or and just an oversight while implementing
>> `git worktree`?
> 
> The latter.  
Ok, so I can adjust some of my helper scripts to catch and forbid this case.
Show 6 quoted lines
> [...]"git worktree" is an interesting feature and has
> potential to become useful in wider variety of workflows than it
> currently is, but end users should consider it still experimental as
> it still is with many such small rough edges like this one.
> 
> Patches to help improving the feature is of course very welcome.

Since the core of the check is in C, I'll pass on this one. I could supply a patch adding this to the "BUGS" section of git-worktree(1) though :-)

← back to recent threads