remote.c: introduce branch.<name>.pushremote

This new configuration variable overrides `remote.pushdefault` and
`branch.<name>.remote` for pushes.  When you pull from one
place (e.g. your upstream) and push to another place (e.g. your own
publishing repository), you would want to set `remote.pushdefault` to
specify the remote to push to for all branches, and use this option to
override it for a specific branch.

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ramkumar Ramachandra 2013-04-02 13:10:34 +05:30 committed by Junio C Hamano
parent 224c217163
commit 9f765ce62f
3 changed files with 34 additions and 4 deletions

View File

@ -730,9 +730,19 @@ branch.<name>.remote::
When on branch <name>, it tells 'git fetch' and 'git push' When on branch <name>, it tells 'git fetch' and 'git push'
which remote to fetch from/push to. The remote to push to which remote to fetch from/push to. The remote to push to
may be overridden with `remote.pushdefault` (for all branches). may be overridden with `remote.pushdefault` (for all branches).
If no remote is configured, or if you are not on any branch, The remote to push to, for the current branch, may be further
it defaults to `origin` for fetching and `remote.pushdefault` overridden by `branch.<name>.pushremote`. If no remote is
for pushing. configured, or if you are not on any branch, it defaults to
`origin` for fetching and `remote.pushdefault` for pushing.
branch.<name>.pushremote::
When on branch <name>, it overrides `branch.<name>.remote` for
pushing. It also overrides `remote.pushdefault` for pushing
from branch <name>. When you pull from one place (e.g. your
upstream) and push to another place (e.g. your own publishing
repository), you would want to set `remote.pushdefault` to
specify the remote to push to for all branches, and use this
option to override it for a specific branch.
branch.<name>.merge:: branch.<name>.merge::
Defines, together with branch.<name>.remote, the upstream branch Defines, together with branch.<name>.remote, the upstream branch
@ -1903,7 +1913,8 @@ receive.updateserverinfo::
remote.pushdefault:: remote.pushdefault::
The remote to push to by default. Overrides The remote to push to by default. Overrides
`branch.<name>.remote` for all branches. `branch.<name>.remote` for all branches, and is overridden by
`branch.<name>.pushremote` for specific branches.
remote.<name>.url:: remote.<name>.url::
The URL of a remote repository. See linkgit:git-fetch[1] or The URL of a remote repository. See linkgit:git-fetch[1] or

View File

@ -364,6 +364,10 @@ static int handle_config(const char *key, const char *value, void *cb)
default_remote_name = branch->remote_name; default_remote_name = branch->remote_name;
explicit_default_remote_name = 1; explicit_default_remote_name = 1;
} }
} else if (!strcmp(subkey, ".pushremote")) {
if (branch == current_branch)
if (git_config_string(&pushremote_name, key, value))
return -1;
} else if (!strcmp(subkey, ".merge")) { } else if (!strcmp(subkey, ".merge")) {
if (!value) if (!value)
return config_error_nonbool(key); return config_error_nonbool(key);

View File

@ -519,6 +519,21 @@ test_expect_success 'push with config remote.*.pushurl' '
check_push_result testrepo $the_commit heads/master check_push_result testrepo $the_commit heads/master
' '
test_expect_success 'push with config branch.*.pushremote' '
mk_test up_repo heads/master &&
mk_test side_repo heads/master &&
mk_test down_repo heads/master &&
test_config remote.up.url up_repo &&
test_config remote.pushdefault side_repo &&
test_config remote.down.url down_repo &&
test_config branch.master.remote up &&
test_config branch.master.pushremote down &&
git push &&
check_push_result up_repo $the_first_commit heads/master &&
check_push_result side_repo $the_first_commit heads/master &&
check_push_result down_repo $the_commit heads/master
'
test_expect_success 'push with dry-run' ' test_expect_success 'push with dry-run' '
mk_test testrepo heads/master && mk_test testrepo heads/master &&