git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
@ 2008-04-23  8:28 Paolo Bonzini
  2008-04-23  9:59 ` Johannes Schindelin
  2008-04-23 16:07 ` Junio C Hamano
  0 siblings, 2 replies; 9+ messages in thread
From: Paolo Bonzini @ 2008-04-23  8:28 UTC (permalink / raw)
  To: Git Mailing List, Junio C Hamano, Johannes Schindelin

In the thread "git remote update -> rejected" Junio and Johannes came to 
the conclusion that "--mirror means that you do not have local 
branches", because "you give control away to the other end on the ref 
namespace".  Furthermore, it was agreed that --mirror currently makes 
sense mostly (or only?) on a bare repository.

 From here I gather that if you have "git remote add --mirror", most 
likely the mirrored repository will be the only remote you have.  There 
is in general no point in having other remotes in a bare repository. 
And so there is no loss of generality if this remote is the "origin" remote.

Hence, my proposal is:

1) Add an option to "git clone", to be used with --bare, to create a 
mirror.  --bare already leaves the original refs in place, without 
moving them under refs/remotes/origin, so it makes sense to optionally 
create the remote.

Actually you don't need to add a new option.  Right now, specifying 
-o/--origin together with --bare would give an error; in my proposal, if 
you had "--bare --origin=source" a remote would be created in the config 
file like this:

[remote "source"]
	url = ...
	fetch = +refs/*:refs/*

2) Modify the --mirror option to "git remote add", so that it creates a 
remote *acting as a mirror of this one*.  The config would look like this:

[remote "mirror"]
         url = ...
         fetch = +refs/heads/*:refs/remotes/mirror/*
         push = +refs/heads/*:refs/heads/*
         push = +refs/tags/*:refs/tags/*
         mirror


Now, I know that this is not what was proposed in the original --mirror 
thread, and it is backwards-incompatible.  On the other hand, I think it 
has several advantages:

1) it does not add special cases such as "--mirror is only to be used in 
a --bare repository".  It moves the functionality to a combination of 
options that used to give an error.

2) it provides an easy-to-use UI to create a mirror of this repository 
somewhere.  With a patch I already posted, "git push" would 
automatically update this mirror.

3) overall, I think it makes a lot of sense: "git remote add" is about 
adding one remote of many, and "git clone" is about setting up a single 
special remote.  Now, you can have many remotes that are 
mirrored-from-here, while you can only have one remote that is 
mirrored-to-here.  So, I believe that "git remote add" should add 
mirrored-from-here remotes, while "git clone" should be used to create a 
mirrored-to-here remote.

Opinions?

Paolo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
  2008-04-23  8:28 [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah" Paolo Bonzini
@ 2008-04-23  9:59 ` Johannes Schindelin
  2008-04-23 16:07 ` Junio C Hamano
  1 sibling, 0 replies; 9+ messages in thread
From: Johannes Schindelin @ 2008-04-23  9:59 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: Git Mailing List, Junio C Hamano

Hi,

On Wed, 23 Apr 2008, Paolo Bonzini wrote:

> In the thread "git remote update -> rejected" Junio and Johannes came to 
> the conclusion that "--mirror means that you do not have local 
> branches", because "you give control away to the other end on the ref 
> namespace".  Furthermore, it was agreed that --mirror currently makes 
> sense mostly (or only?) on a bare repository.

Yes.  But the opposite may not be true: if you plan to work on many 
workdirs, but the same repository, you might still want to have separate 
remotes layout.

In any case, I think that this discussion is too early: clone should be 
builtin first, making things much simpler because of being a very thin 
layer on top of init && remote && fetch.

But yes, there is a lot of work left on the builtin-clone to make it so.

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
  2008-04-23  8:28 [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah" Paolo Bonzini
  2008-04-23  9:59 ` Johannes Schindelin
@ 2008-04-23 16:07 ` Junio C Hamano
  2008-04-23 16:56   ` Daniel Barkalow
  2008-04-23 20:06   ` Paolo Bonzini
  1 sibling, 2 replies; 9+ messages in thread
From: Junio C Hamano @ 2008-04-23 16:07 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: Git Mailing List, Johannes Schindelin

Paolo Bonzini <bonzini@gnu.org> writes:

> In the thread "git remote update -> rejected" Junio and Johannes came
> to the conclusion that "--mirror means that you do not have local
> branches", because "you give control away to the other end on the ref
> namespace".  Furthermore, it was agreed that --mirror currently makes
> sense mostly (or only?) on a bare repository.
>
> From here I gather that if you have "git remote add --mirror", most
> likely the mirrored repository will be the only remote you have.
> There is in general no point in having other remotes in a bare
> repository. And so there is no loss of generality if this remote is
> the "origin" remote.
>
> Hence, my proposal is:
>
> 1) Add an option to "git clone", to be used with --bare, to create a
> mirror.  --bare already leaves the original refs in place, without
> moving them under refs/remotes/origin, so it makes sense to optionally
> create the remote.

I actually had a slightly different vision.  A mid-term goal should be to
reimplement "clone" that has a lot of code duplication with "fetch" and
"remote" in terms of "init + remote + fetch + checkout" [*1*].  For that
to happen, I suspect that "remote" needs to learn a few more tricks than
it currently knows (e.g. "figuring out the HEAD").

I would agree that it is useful for "clone" to create a bare repository in
a mode that can be used for further cloning by other repositories (perhaps
the former sits at the firewall boundary that it is cumbersome to cross by
the latter).  As you described above, we already have that (iow, "--bare").

And "remote add --mirror" would be an implementation detail to produce
such a clone.  It is mostly about fetching.

An option to add a back-up repository that you can maintain an exact
mirror of your working repository would be useful, but that is different
from what "remote add --mirror" is about.

[Footnote]

*1* In that sense, a more sensible order than rewriting "clone" in C in
its current form would be to make necessary enhancements to the components
in this sequence that need to implement clone, figure out how they should
fit together and first make "clone" a four-liner shell script. Then
rewriting the result in C may become more trivial.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
  2008-04-23 16:07 ` Junio C Hamano
@ 2008-04-23 16:56   ` Daniel Barkalow
  2008-04-23 22:25     ` Jeff King
  2008-04-23 20:06   ` Paolo Bonzini
  1 sibling, 1 reply; 9+ messages in thread
From: Daniel Barkalow @ 2008-04-23 16:56 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Paolo Bonzini, Git Mailing List, Johannes Schindelin

On Wed, 23 Apr 2008, Junio C Hamano wrote:

> *1* In that sense, a more sensible order than rewriting "clone" in C in
> its current form would be to make necessary enhancements to the components
> in this sequence that need to implement clone, figure out how they should
> fit together and first make "clone" a four-liner shell script. Then
> rewriting the result in C may become more trivial.

clone can't be a four-liner shell script, because it has to come up with 
the name of the working directory for a non-bare clone, which doesn't make 
sense for any other program. Currently, a local clone is special in that 
it duplicates all of the objects without checking whether the destination 
already has them (because it can't have anything) or whether they're 
actually needed; fetch could do some similar stuff, but couldn't do quite 
that much optimization, because it's not likely the same special case.

Something needs to get the code to figure out the remote HEAD, and it 
shouldn't be "remote" for clone's use, because then clone would take an 
extra connection, since "fetch" obviously has to connect and "remote" 
would run before it and in a separate process.

It also needs to support --reference (list another repository's refs as 
your refs, because you have that repository as an alternate but don't have 
your own refs that use its objects), which is sort of plausible for fetch 
but much less useful.

Aside from that, it's obviously got quite a few lines of option parsing to 
get the right arguments to the things it calls, as well as determining 
whether to check out a branch (depending on what we did with the origin) 
and such.

	-Daniel
*This .sig left intentionally blank*

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
  2008-04-23 16:07 ` Junio C Hamano
  2008-04-23 16:56   ` Daniel Barkalow
@ 2008-04-23 20:06   ` Paolo Bonzini
  2008-04-23 22:02     ` Junio C Hamano
  1 sibling, 1 reply; 9+ messages in thread
From: Paolo Bonzini @ 2008-04-23 20:06 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Git Mailing List, Johannes Schindelin


> *1* In that sense, a more sensible order than rewriting "clone" in C in
> its current form would be to make necessary enhancements to the components
> in this sequence that need to implement clone, figure out how they should
> fit together and first make "clone" a four-liner shell script. Then
> rewriting the result in C may become more trivial.

On the other hand, a C version may have the necessary APIs available to 
support this kind of enhancement, but the APIs may not be there for a 
shell script.

It seems useless to have an option in "git remote add" just because it 
might be necessary in a future refactoring of "git clone", but without a 
good use case beside that one -- because right now "git remote add 
--mirror" is close to useless: anyone who needs it 99% of the time knows 
how to hack the config, unlike people who just want a quick way to 
remotely backup of their repository.

Paolo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
  2008-04-23 20:06   ` Paolo Bonzini
@ 2008-04-23 22:02     ` Junio C Hamano
  2008-04-23 22:42       ` Johannes Schindelin
  2008-04-24  6:23       ` Paolo Bonzini
  0 siblings, 2 replies; 9+ messages in thread
From: Junio C Hamano @ 2008-04-23 22:02 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: Git Mailing List, Johannes Schindelin

Paolo Bonzini <bonzini@gnu.org> writes:

> It seems useless to have an option in "git remote add" just because it
> might be necessary in a future refactoring of "git clone", but without
> a good use case beside that one.

Ooo.  But I think that's the other way around.  It was prepared for that
purpose but people never followed through.  Check the archive around
commit 3894439 (Teach "git remote" a mirror mode, 2007-09-02).

> --mirror" is close to useless: anyone who needs it 99% of the time
> knows how to hack the config...

Eh, in that sense, "git remote" itself is useless, isn't it?  I have to
say that this particular point of your argument does not give us any new
or interesting insight to work from.

As I already said, I think "push to backup" option would be useful.  It
just cannot take over --mirror option, which means something different.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
  2008-04-23 16:56   ` Daniel Barkalow
@ 2008-04-23 22:25     ` Jeff King
  0 siblings, 0 replies; 9+ messages in thread
From: Jeff King @ 2008-04-23 22:25 UTC (permalink / raw)
  To: Daniel Barkalow
  Cc: Junio C Hamano, Paolo Bonzini, Git Mailing List,
	Johannes Schindelin

On Wed, Apr 23, 2008 at 12:56:41PM -0400, Daniel Barkalow wrote:

> Something needs to get the code to figure out the remote HEAD, and it 
> shouldn't be "remote" for clone's use, because then clone would take an 
> extra connection, since "fetch" obviously has to connect and "remote" 
> would run before it and in a separate process.

Actually, having "fetch" figure out the HEAD would be a nice feature,
since then you could track the remote's idea of HEAD as time passes.

AIUI, we could get by with a single connection over git:// with a
protocol extension.

-Peff

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
  2008-04-23 22:02     ` Junio C Hamano
@ 2008-04-23 22:42       ` Johannes Schindelin
  2008-04-24  6:23       ` Paolo Bonzini
  1 sibling, 0 replies; 9+ messages in thread
From: Johannes Schindelin @ 2008-04-23 22:42 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Paolo Bonzini, Git Mailing List

Hi,

On Wed, 23 Apr 2008, Junio C Hamano wrote:

> Paolo Bonzini <bonzini@gnu.org> writes:
> 
> > It seems useless to have an option in "git remote add" just because it 
> > might be necessary in a future refactoring of "git clone", but without 
> > a good use case beside that one.
> 
> Ooo.  But I think that's the other way around.

I think it is very much the other way round.  "git remote add" is meant 
for adding _additional_ remotes.  "git clone" just _happens_ to install an 
"origin" remote.

I even have a case where I used "--mirror" _twice_ in the same, _non_-bare 
repository.  It has merit, you know?

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah"
  2008-04-23 22:02     ` Junio C Hamano
  2008-04-23 22:42       ` Johannes Schindelin
@ 2008-04-24  6:23       ` Paolo Bonzini
  1 sibling, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2008-04-24  6:23 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Git Mailing List, Johannes Schindelin

> Ooo.  But I think that's the other way around.  It was prepared for that
> purpose but people never followed through.  Check the archive around
> commit 3894439 (Teach "git remote" a mirror mode, 2007-09-02).

Well, the thread is not very explicative.  Neither is the commit log 
message.  There is no info as to *why* it is useful.

After finding no particularly good info in the commit, and seeing that 
the functionality is unused within git's shell script porcelain, I wrote 
my RFC on the intuition that it is a failed experiment.  (The rest of 
this message is also assuming this possibly wrong intuition).

>> --mirror" is close to useless: anyone who needs it 99% of the time
>> knows how to hack the config...
> 
> Eh, in that sense, "git remote" itself is useless, isn't it?

Hm, bad sentence on my side.  My point was that my proposed improvements 
to clone:

   git clone --bare -o origin <url> foo.git

satisfy 99% of the usecase; you usually know beforehand if you're 
cloning for local development or for mirrors.   Anyone who *still* needs 
--mirror after that (i.e. needs two mirror-mode remotes, or needs it on 
non-bare repositories), 99% of the time knows how to hack the config. 
Actually in the latter case (non-bare repos) he might have to hack the 
config soon, if Dscho's patch to forbid this is polished and goes in.

In the end, this piece of functionality is almost unused (surely unused 
within git's shell porcelain, if not in the wild) and is dubiously 
placed for two reasons:

1) If the point of git remote is to shield from the config, what the 
user will learn is that "git remote" is about "git branch -r" (maybe 
he'll also learn "refs/remotes/something").  Now instead you have an 
option that goes under "git remote" just because it creates remote.* 
configuration options.  Indeed, "git remote add --mirror -f" will create 
*local* branches, so that "git branch -r" does not show them.

2) Similarly, "--mirror" suggests that the remote will go hand in hand 
with "git push" (that has the "--mirror" option, and this started my 
confusion) rather than "git fetch"/"git pull".  Indeed, even after my 
patch[1] to add some DWIM functionality for mirrors to "git push", the 
user will need to hack the config file manually to activate the DWIM.

Instead, my proposed meaning of "git remote add --mirror" would fix both 
discrepancies...

Paolo

[1] http://marc.info/?l=git&m=120877130932254&w=2

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2008-04-24  6:24 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-23  8:28 [RFC] Moving "git remote add --mirror blah" functionality to "git clone --bare --origin=blah" Paolo Bonzini
2008-04-23  9:59 ` Johannes Schindelin
2008-04-23 16:07 ` Junio C Hamano
2008-04-23 16:56   ` Daniel Barkalow
2008-04-23 22:25     ` Jeff King
2008-04-23 20:06   ` Paolo Bonzini
2008-04-23 22:02     ` Junio C Hamano
2008-04-23 22:42       ` Johannes Schindelin
2008-04-24  6:23       ` Paolo Bonzini

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).