Subject: Re: [PATCH] Documentation: update git-pull.txt for clone's new default behavior

From: Luben Tuikov <[email-masked]>
Date: Mon, 1 Jan 2007 18:05:11 -0800 (PST)

--- Junio C Hamano <[email-masked]> wrote:
> What's going on is clean-up towards v1.5.0-rc1 ;-).
> 
>  - 'git clone' does not create a file that has a line that looks
>    like "Pull: master:origin" anywhere anymore.
> 
>  - 'git clone' also does not create the traditional "'master' is
>    special and we map that to origin, others are mapped as is
>    under refs/heads/, and we have to drop 'origin' from the
>    remote side because that name we want to use to store their
>    'master'" layout.
> 
> So after a clone, you would get:
> 
> 	[remote "origin"]
>         	url = ....
>                 fetch = refs/heads/*:refs/remotes/origin/*
>         [branch "master"]
>         	remote = origin
>                 merge = refs/heads/master
> 
> This configuration still causes "git pull" or "git pull origin"
> while on "master" to fetch and store the remote side's master as
> what you can refer to as 'origin' (because it expands to
> 'remotes/origin/HEAD' thanks to sha1_name.c::get_sha1_basic()),
> and then merges that to your current branch, so there is no
> change in the user experience in the big picture, but what is
> created to achieve that effect is different from what was
> described.

Ah, I see.  Thanks Junio.

... And this is why I see some objections as to what I'm proposing
because it extends too far the extension itself of the old
behavior. (See below.)

Questions:

What is the reasonining of defining branch.<name>.merge to point
to the "remote's setup"?  I would much, much rather stop the leak
of the remote's setup right at [remote] and contain it there,
while everything in [branch] would refer to local stuff.

So the above configuration would become:

 	[remote "origin"]
         	url = ....
                fetch = refs/heads/*:refs/remotes/origin/*
        [branch "master"]
         	remote = origin
# merge gives the place and name of the remote branch locally mapped
                merge = refs/heads/origin/master
# OR, better yet
# merge gives the name only of the remote branch to be merged
# the local mapping can be found from "remote = " above
                merge = master

The reasoning is that the remote's setup should only leak into
[remote] and no further.  I.e. [remote] is the only one concerned
with the mapping between the remote repo and the local repo.

Then, [branch] only talks about local relationships.  Now
since [branch] does refer to _where_ the local mapping resolves
to, i.e. the right hand part of `:', then there is a redundancy
in branch.<name>.merge, since branch.<name>.remote _does refer_
to [remote] where we can find where it is locally mapped.

Thus, by reducibility, branch.name.merge should only contain
a name.  Here is the dependency graph:

branch.name.merge <- (gives a local name)
      branch.name.remote <- (gives the remote)
            remote.rname.fetch <- (gives the remote:local name mapping)
                   remote.rname.url (gives the URL).

Now as to what I'm talking about, should be able to be had with:

     [remote "parent"]
           url = .
           fetch = :
     [branch "A"]
           remote = parent
           merge = master
     [branch "B"]
           remote = parent
           merge = A
     [branch "C"]
           remote = parent
           merge = B

   Luben