* Separate default remotes for pulling and pushing
@ 2011-05-07 8:10 David Lee
2011-05-07 9:50 ` Sverre Rabbelier
0 siblings, 1 reply; 14+ messages in thread
From: David Lee @ 2011-05-07 8:10 UTC (permalink / raw)
To: git
Hello,
I couldn't find a way to do this, but it seems it would be a fairly common use-case:
I want to set up different default remotes for pushing and pulling so that I can pull from remote a using "git pull" and push to remote b using "git push". This is particularly useful when committing to projects on github, since you may only push to your fork, but you only want to pull updates from the original.
Right now, I can either set the original as my default remote, in which case I must use "git push myfork", or I can set my fork as the default remote, in which case I must use "git pull original".
Please let me know if I'm overlooking a feature already present in git that allows me to have separate remotes for pull and push. Otherwise, I hope it gets implemented in the next version of git!
Thanks for reading,
David
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-07 8:10 Separate default remotes for pulling and pushing David Lee
@ 2011-05-07 9:50 ` Sverre Rabbelier
2011-05-09 8:17 ` Jeff King
0 siblings, 1 reply; 14+ messages in thread
From: Sverre Rabbelier @ 2011-05-07 9:50 UTC (permalink / raw)
To: David Lee; +Cc: git
Heya,
On Sat, May 7, 2011 at 10:10, David Lee <davidomundo@gmail.com> wrote:
> I want to set up different default remotes for pushing and pulling
See 'git remote set-url --push' [0].
[0] http://www.kernel.org/pub/software/scm/git/docs/git-remote.html
--
Cheers,
Sverre Rabbelier
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-07 9:50 ` Sverre Rabbelier
@ 2011-05-09 8:17 ` Jeff King
2011-05-09 8:34 ` David Lee
2011-05-09 16:45 ` Junio C Hamano
0 siblings, 2 replies; 14+ messages in thread
From: Jeff King @ 2011-05-09 8:17 UTC (permalink / raw)
To: Sverre Rabbelier; +Cc: David Lee, git
On Sat, May 07, 2011 at 11:50:35AM +0200, Sverre Rabbelier wrote:
> On Sat, May 7, 2011 at 10:10, David Lee <davidomundo@gmail.com> wrote:
> > I want to set up different default remotes for pushing and pulling
>
> See 'git remote set-url --push' [0].
>
> [0] http://www.kernel.org/pub/software/scm/git/docs/git-remote.html
That probably doesn't quite do what David wants. It's useful when the
URL for pushing and pulling a particular repository are different.
But if I understand it correctly, David has two _separate_ repositories.
And using remote.*.pushurl for that has some unwanted side effects,
because the tracking ref namespace (i.e., "remotes/origin/*") is shared
by both, even though their refs may not be at the same position.
For example, when pushing "refs/heads/master" to the remote, git will
update "refs/remotes/origin/master" to the pushed value. But that ref is
supposed to reflect the value of the last fetch from his "original"
repository, and now it doesn't. The ref value will flip back and forth
between what's in the two repositories as he pushes and fetches.
I don't think there is currently a way to do what he wants. I think it
would be useful for certain workflows. As I see it, there are a few
pretty common setups for remotes:
1. Centralized; you push and pull from a single repo, shared with
other developers. In this case, you call it "origin" and everything
is easy.
2. Decentralized, you're the maintainer; you pull from other people or
apply patches via email. When you push, you push out to some
publishing point. You'd probably call your publishing point
"origin" (though I think Junio calls kernel.org "ko" and just types
"git push ko"). You never pull from some single place all the time,
so you don't care about a shorthand for it.
3. Decentralized, you're a developer with a patch-based workflow; you
fetch from the maintainer, then develop and submit patches via a
mailing list. You call the maintainer's repo "origin" and pull from
it automatically. You never push, so it doesn't matter that
there's no shorthand.
4. Decentralized, you're a developer that publishes work via git. You
call the upstream maintainer "origin", so fetches are convenient
(and git does this for you at clone, after all). But pushing, even
though you probably always push to the same central, does not have
a convenient shorthand.
This is David's case (and mine, and I suspect some other git
developers who do enough work that they want to make it publicly
available via git, or even just have backups). It's also encouraged
by sites like github, where you might clone the upstream's
repository, but then pushes your changes up to a personal "fork"
to let others see and merge them.
So I think part of the reason we don't have such an option is that cases
1-3 are so common. But it would be a nice convenience for people in case
4.
-Peff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 8:17 ` Jeff King
@ 2011-05-09 8:34 ` David Lee
2011-05-09 11:10 ` Jeff King
2011-05-09 16:45 ` Junio C Hamano
1 sibling, 1 reply; 14+ messages in thread
From: David Lee @ 2011-05-09 8:34 UTC (permalink / raw)
To: Jeff King; +Cc: Sverre Rabbelier, git
Hey Jeff,
Thanks for the super write-up.
> That probably doesn't quite do what David wants. It's useful when the
> URL for pushing and pulling a particular repository are different.
>
> But if I understand it correctly, David has two _separate_ repositories.
> And using remote.*.pushurl for that has some unwanted side effects,
> because the tracking ref namespace (i.e., "remotes/origin/*") is shared
> by both, even though their refs may not be at the same position.
>
> For example, when pushing "refs/heads/master" to the remote, git will
> update "refs/remotes/origin/master" to the pushed value. But that ref is
> supposed to reflect the value of the last fetch from his "original"
> repository, and now it doesn't. The ref value will flip back and forth
> between what's in the two repositories as he pushes and fetches.
I was actually using Sverre's recommendation with virtually no problems except for what you mention: the ref value flips back and forth.
> 4. Decentralized, you're a developer that publishes work via git. You
> call the upstream maintainer "origin", so fetches are convenient
> (and git does this for you at clone, after all). But pushing, even
> though you probably always push to the same central, does not have
> a convenient shorthand.
By "push to the same central", I assume you mean "push to the same mirror of origin".
>
> This is David's case (and mine, and I suspect some other git
> developers who do enough work that they want to make it publicly
> available via git, or even just have backups). It's also encouraged
> by sites like github, where you might clone the upstream's
> repository, but then pushes your changes up to a personal "fork"
> to let others see and merge them.
>
> So I think part of the reason we don't have such an option is that cases
> 1-3 are so common. But it would be a nice convenience for people in case
> 4.
I think github is making option 4 the dominant use case. In fact, in our workplace we have a similar workflow set up, where we pull from a central origin, but push to individual mirrors from where commits are reviewed, tested, and merged unto origin.
--David
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 8:34 ` David Lee
@ 2011-05-09 11:10 ` Jeff King
2011-05-09 19:01 ` David Lee
0 siblings, 1 reply; 14+ messages in thread
From: Jeff King @ 2011-05-09 11:10 UTC (permalink / raw)
To: David Lee; +Cc: Sverre Rabbelier, git
On Mon, May 09, 2011 at 01:34:22AM -0700, David Lee wrote:
> > 4. Decentralized, you're a developer that publishes work via git. You
> > call the upstream maintainer "origin", so fetches are convenient
> > (and git does this for you at clone, after all). But pushing, even
> > though you probably always push to the same central, does not have
> > a convenient shorthand.
>
> By "push to the same central", I assume you mean "push to the same mirror of origin".
Yeah, sorry, that was supposed to be "central spot", but I think you got
the meaning.
> I think github is making option 4 the dominant use case. In fact, in
> our workplace we have a similar workflow set up, where we pull from a
> central origin, but push to individual mirrors from where commits are
> reviewed, tested, and merged unto origin.
Yeah, I think we will see more of that as decentralized workflows (and
the tools that support them) mature.
With respect to supporting an alternate default push destination, I'm
not sure what is the best change to make. If "origin" were simply the
default, I would say we should have a push.defaultRemote config that
lets you specify something else.
But it's not that simple. If you are on branch "foo", and you have
"branch.foo.remote" set in your config, then the value of that config
option becomes the default remote. Which makes some sense for pulling
(and there is the associated branch.*.merge config), but of course
pushing may not match.
But now we have precedence questions. If I have config like:
[push]
defaultRemote = my-mirror
[branch "foo"]
remote = origin
merge = refs/heads/master
which remote should be the default for "git push"? Obviously if I'm not
on "foo", it should be my-mirror. But if I am, should push.defaultRemote
take precedence? Should there also be a branch.*.pushRemote config that
takes precedence over branch.*.remote?
I have to admit that I have never found the branch.*.remote config to be
useful for any of my workflows, so I am not really sure how people use
it.
-Peff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 8:17 ` Jeff King
2011-05-09 8:34 ` David Lee
@ 2011-05-09 16:45 ` Junio C Hamano
2011-05-09 22:04 ` Jeff King
1 sibling, 1 reply; 14+ messages in thread
From: Junio C Hamano @ 2011-05-09 16:45 UTC (permalink / raw)
To: Jeff King; +Cc: Sverre Rabbelier, David Lee, git
Jeff King <peff@peff.net> writes:
> 4. Decentralized, you're a developer that publishes work via git. You
> call the upstream maintainer "origin", so fetches are convenient
> (and git does this for you at clone, after all). But pushing, even
> though you probably always push to the same central, does not have
> a convenient shorthand.
>
> This is David's case (and mine, and I suspect some other git
> developers who do enough work that they want to make it publicly
> available via git, or even just have backups). It's also encouraged
> by sites like github, where you might clone the upstream's
> repository, but then pushes your changes up to a personal "fork"
> to let others see and merge them.
In a sense, this is what I do as well. As you mentioned, I push to "ko"
to publish, but when I "fetch" (or "pull") from "origin", I get the public
copy I have at kernel.org like everybody else, and I do fetch every time
after I push to "ko" to get the updated preformatted HTML and man page
branches.
I never felt it awkward that my fetch says "origin" and my push says "ko".
Even though I imagine that I could smash them together into a single
"origin", it would not give me anything, as I also push to push to
different places like repo.or.cz, sourceforge and github anyway.
While I see why some people might want to say "origin" for both in such a
set-up (when they do not push to multiple places like I do), I have a
feeling that it is a misguided wish that would make themselves unnecessary
confused than they already are, especially if the repositories used for
pushing and fetching are in reality different repositories (one good
example why it would be confusing is how remote tracking branches are
updated).
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 11:10 ` Jeff King
@ 2011-05-09 19:01 ` David Lee
2011-05-09 22:06 ` Jeff King
0 siblings, 1 reply; 14+ messages in thread
From: David Lee @ 2011-05-09 19:01 UTC (permalink / raw)
To: Jeff King; +Cc: Sverre Rabbelier, git
> But now we have precedence questions. If I have config like:
>
> [push]
> defaultRemote = my-mirror
>
> [branch "foo"]
> remote = origin
> merge = refs/heads/master
>
> which remote should be the default for "git push"? Obviously if I'm not
> on "foo", it should be my-mirror. But if I am, should push.defaultRemote
> take precedence? Should there also be a branch.*.pushRemote config that
> takes precedence over branch.*.remote?
>
> I have to admit that I have never found the branch.*.remote config to be
> useful for any of my workflows, so I am not really sure how people use
> it.
What about removing the branch.*.remote config by default, and if it's not set, then it defaults to whatever the repo-wide setting is for defaultRemote? Then a branch.*.remote would override the defaultRemote, and a branch.*.pushRemote would again override that.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 16:45 ` Junio C Hamano
@ 2011-05-09 22:04 ` Jeff King
2011-05-09 22:46 ` Junio C Hamano
2011-05-10 12:47 ` Jay Soffian
0 siblings, 2 replies; 14+ messages in thread
From: Jeff King @ 2011-05-09 22:04 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Sverre Rabbelier, David Lee, git
On Mon, May 09, 2011 at 09:45:49AM -0700, Junio C Hamano wrote:
> Jeff King <peff@peff.net> writes:
>
> > 4. Decentralized, you're a developer that publishes work via git. You
> > call the upstream maintainer "origin", so fetches are convenient
> > (and git does this for you at clone, after all). But pushing, even
> > though you probably always push to the same central, does not have
> > a convenient shorthand.
> >
> > This is David's case (and mine, and I suspect some other git
> > developers who do enough work that they want to make it publicly
> > available via git, or even just have backups). It's also encouraged
> > by sites like github, where you might clone the upstream's
> > repository, but then pushes your changes up to a personal "fork"
> > to let others see and merge them.
>
> In a sense, this is what I do as well. As you mentioned, I push to "ko"
> to publish, but when I "fetch" (or "pull") from "origin", I get the public
> copy I have at kernel.org like everybody else, and I do fetch every time
> after I push to "ko" to get the updated preformatted HTML and man page
> branches.
Interesting. Is your fetch from "ko" a no-op, or are you using it to
syncrhonize development between different machines?
> While I see why some people might want to say "origin" for both in such a
> set-up (when they do not push to multiple places like I do), I have a
> feeling that it is a misguided wish that would make themselves unnecessary
> confused than they already are, especially if the repositories used for
> pushing and fetching are in reality different repositories (one good
> example why it would be confusing is how remote tracking branches are
> updated).
I think it is important to note that calling them both "origin" is
definitely the wrong thing. The proposal is instead that "git push"
without a remote would default to something besides "origin". For people
who publish multiple places, it might even make sense for it to be an
iterative push to each place.
But this is all definitely a minor convenience. It is not that
world-shattering to type "git push my-fork", nor "git push my-fork &&
git push my-backup". Probably twice a week I accidentally try to push to
"git://git.kernel.org/pub/scm/git/git.git", but git make it clear that
is not allowed. :)
-Peff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 19:01 ` David Lee
@ 2011-05-09 22:06 ` Jeff King
0 siblings, 0 replies; 14+ messages in thread
From: Jeff King @ 2011-05-09 22:06 UTC (permalink / raw)
To: David Lee; +Cc: Sverre Rabbelier, git
On Mon, May 09, 2011 at 12:01:53PM -0700, David Lee wrote:
> > But now we have precedence questions. If I have config like:
> >
> > [push]
> > defaultRemote = my-mirror
> >
> > [branch "foo"]
> > remote = origin
> > merge = refs/heads/master
> >
> > which remote should be the default for "git push"? Obviously if I'm not
> > on "foo", it should be my-mirror. But if I am, should push.defaultRemote
> > take precedence? Should there also be a branch.*.pushRemote config that
> > takes precedence over branch.*.remote?
> >
> > I have to admit that I have never found the branch.*.remote config to be
> > useful for any of my workflows, so I am not really sure how people use
> > it.
>
> What about removing the branch.*.remote config by default, and if it's
> not set, then it defaults to whatever the repo-wide setting is for
> defaultRemote? Then a branch.*.remote would override the
> defaultRemote, and a branch.*.pushRemote would again override that.
The branch.*.remote config does much more, though. For example, it is
part of the "upstream" branch config. So getting rid of it is definitely
not an option.
-Peff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 22:04 ` Jeff King
@ 2011-05-09 22:46 ` Junio C Hamano
2011-05-10 20:17 ` Jeff King
2011-05-10 12:47 ` Jay Soffian
1 sibling, 1 reply; 14+ messages in thread
From: Junio C Hamano @ 2011-05-09 22:46 UTC (permalink / raw)
To: Jeff King; +Cc: Sverre Rabbelier, David Lee, git
Jeff King <peff@peff.net> writes:
>> In a sense, this is what I do as well. As you mentioned, I push to "ko"
>> to publish, but when I "fetch" (or "pull") from "origin", I get the public
>> copy I have at kernel.org like everybody else, and I do fetch every time
>> after I push to "ko" to get the updated preformatted HTML and man page
>> branches.
>
> Interesting. Is your fetch from "ko" a no-op, or are you using it to
> syncrhonize development between different machines?
Preformatted html and man pages are made when I push the integrated source
branches out, triggered from the post-update hook at kernel.org. I do not
format them on my box.
I say "git push ko", take a sip of tea, and after k.org finishes the
asciidoc dance "git fetch ko" to get them all, before pushing
remotes/ko/{maint,master,next,pu,todo,html,man} to secondary sites.
> I think it is important to note that calling them both "origin" is
> definitely the wrong thing. The proposal is instead that "git push"
> without a remote would default to something besides "origin". For people
> who publish multiple places, it might even make sense for it to be an
> iterative push to each place.
Either we add branch.<name>.pushremote or push.defaultremote then?
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 22:04 ` Jeff King
2011-05-09 22:46 ` Junio C Hamano
@ 2011-05-10 12:47 ` Jay Soffian
2011-05-10 20:20 ` Jeff King
1 sibling, 1 reply; 14+ messages in thread
From: Jay Soffian @ 2011-05-10 12:47 UTC (permalink / raw)
To: Jeff King; +Cc: Junio C Hamano, Sverre Rabbelier, David Lee, git
On Mon, May 9, 2011 at 6:04 PM, Jeff King <peff@peff.net> wrote:
> I think it is important to note that calling them both "origin" is
> definitely the wrong thing. The proposal is instead that "git push"
> without a remote would default to something besides "origin". For people
> who publish multiple places, it might even make sense for it to be an
> iterative push to each place.
While developing in a particular repo, I constantly have to push to
two compile machines. I just dropped a Makefile into the top of my
working tree:
all: push
amend:
git amend -a
git --no-pager diff @{1}
make push
push:
make -j 2 mac win
mac:
git push mac
win:
git push win
j.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-09 22:46 ` Junio C Hamano
@ 2011-05-10 20:17 ` Jeff King
0 siblings, 0 replies; 14+ messages in thread
From: Jeff King @ 2011-05-10 20:17 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Sverre Rabbelier, David Lee, git
On Mon, May 09, 2011 at 03:46:19PM -0700, Junio C Hamano wrote:
> > Interesting. Is your fetch from "ko" a no-op, or are you using it to
> > syncrhonize development between different machines?
>
> Preformatted html and man pages are made when I push the integrated source
> branches out, triggered from the post-update hook at kernel.org. I do not
> format them on my box.
Ah, that makes sense.
> > I think it is important to note that calling them both "origin" is
> > definitely the wrong thing. The proposal is instead that "git push"
> > without a remote would default to something besides "origin". For people
> > who publish multiple places, it might even make sense for it to be an
> > iterative push to each place.
>
> Either we add branch.<name>.pushremote or push.defaultremote then?
I don't think most people would want just branch.<name>.pushremote. They
are more likely to want to always push to some place, so
push.defaultremote is a better choice.
But that has weird precedence problems. We auto-create branch.*.remote,
so if branch-specific config takes precedence, their push.defaultremote
will almost never be used. And if branch-specific config _doesn't_ take
precedence, then that is weird and unlike almost every other part of
git.
Another option is to mark the remote with an explicit "don't push here,
push to this other remote instead" config, like:
$ git remote add my-fork host:project.git
$ git config remote.origin.pushremote my-fork
$ git push ;# acts as if you did "git push my-fork"
And then when we default to a remote, either because it is "origin" or
because it is in branch.*.remote, then we will end up pushing to the
right place.
I'm unsure what should happen in the case of:
$ git config remote.origin.pushremote my-fork
$ git push origin
In the workflow we described, "origin" is simply not a push-able remote,
so it is a slight convenience to intercept all pushes for it and
transparently rewrite them to "my-fork". And it makes the concept of
that config slightly simpler. It basically becomes the equivalent of
remote.*.pushurl, except that we are clear that it is a totally separate
remote with different tracking branches.
But it does eliminate any workflow where "origin" is _sometimes_
pushable, but you almost always want to push somewhere else instead.
Because you have no way to push to "origin" now. I don't know of any
such workflow, but I hate to be restrictive for no good reason.
If it just handles "use this remote instead only in the case of a
default selection", then the name should probably be like
"defaultpushremote" or something.
-Peff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-10 12:47 ` Jay Soffian
@ 2011-05-10 20:20 ` Jeff King
2011-05-10 21:12 ` Jay Soffian
0 siblings, 1 reply; 14+ messages in thread
From: Jeff King @ 2011-05-10 20:20 UTC (permalink / raw)
To: Jay Soffian; +Cc: Junio C Hamano, Sverre Rabbelier, David Lee, git
On Tue, May 10, 2011 at 08:47:53AM -0400, Jay Soffian wrote:
> On Mon, May 9, 2011 at 6:04 PM, Jeff King <peff@peff.net> wrote:
> > I think it is important to note that calling them both "origin" is
> > definitely the wrong thing. The proposal is instead that "git push"
> > without a remote would default to something besides "origin". For people
> > who publish multiple places, it might even make sense for it to be an
> > iterative push to each place.
>
> While developing in a particular repo, I constantly have to push to
> two compile machines. I just dropped a Makefile into the top of my
> working tree:
>
> all: push
> amend:
> git amend -a
> git --no-pager diff @{1}
> make push
> push:
> make -j 2 mac win
> mac:
> git push mac
> win:
> git push win
Yeah, I have scripts to help with that sort of thing now. But that is
often an unsatisfactory solution, because either:
1. Your Makefile is not version-controlled.
2. Your are polluting the project history with stuff specific to your
workflow. I would not get very far proposing that git.git's
Makefile contain such a thing. :)
That's how Junio ended up with his "Meta" directory (and I have one,
too, but with drastically different things in it).
-Peff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Separate default remotes for pulling and pushing
2011-05-10 20:20 ` Jeff King
@ 2011-05-10 21:12 ` Jay Soffian
0 siblings, 0 replies; 14+ messages in thread
From: Jay Soffian @ 2011-05-10 21:12 UTC (permalink / raw)
To: Jeff King; +Cc: Junio C Hamano, Sverre Rabbelier, David Lee, git
On Tue, May 10, 2011 at 4:20 PM, Jeff King <peff@peff.net> wrote:
> Yeah, I have scripts to help with that sort of thing now. But that is
> often an unsatisfactory solution, because either:
>
> 1. Your Makefile is not version-controlled.
Sure, but your .git/config is similarly not version controlled.
>
> 2. Your are polluting the project history with stuff specific to your
> workflow. I would not get very far proposing that git.git's
> Makefile contain such a thing. :)
>
> That's how Junio ended up with his "Meta" directory (and I have one,
> too, but with drastically different things in it).
As well. :-)
j.
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2011-05-10 21:13 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-07 8:10 Separate default remotes for pulling and pushing David Lee
2011-05-07 9:50 ` Sverre Rabbelier
2011-05-09 8:17 ` Jeff King
2011-05-09 8:34 ` David Lee
2011-05-09 11:10 ` Jeff King
2011-05-09 19:01 ` David Lee
2011-05-09 22:06 ` Jeff King
2011-05-09 16:45 ` Junio C Hamano
2011-05-09 22:04 ` Jeff King
2011-05-09 22:46 ` Junio C Hamano
2011-05-10 20:17 ` Jeff King
2011-05-10 12:47 ` Jay Soffian
2011-05-10 20:20 ` Jeff King
2011-05-10 21:12 ` Jay Soffian
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).