aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/config.txt5
-rw-r--r--Documentation/git-checkout.txt5
-rw-r--r--builtin-branch.c18
-rwxr-xr-xt/t3200-branch.sh9
4 files changed, 28 insertions, 9 deletions
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 4b67f0adf..aeece848a 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -309,7 +309,10 @@ branch.autosetupmerge::
so that gitlink:git-pull[1] will appropriately merge from that
remote branch. Note that even if this option is not set,
this behavior can be chosen per-branch using the `--track`
- and `--no-track` options. This option defaults to false.
+ and `--no-track` options. This option can have values
+ 'false' (never touch the configuration), 'all' (do this
+ for all branches), or 'true' (do this only when
+ branching from a remote tracking branch), and defaults to 'true'.
branch.<name>.remote::
When in branch <name>, it tells `git fetch` which remote to fetch.
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index 818b720b9..82929523c 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -52,8 +52,9 @@ OPTIONS
set up configuration so that git-pull will automatically
retrieve data from the remote branch. Set the
branch.autosetupmerge configuration variable to true if you
- want git-checkout and git-branch to always behave as if
- '--track' were given.
+ want git-checkout and git-branch to behave as if
+ '--track' were given when you branch from a remote
+ tracking branch.
--no-track::
When -b is given and a branch is created off a remote branch,
diff --git a/builtin-branch.c b/builtin-branch.c
index 84a8ad7b7..423c30194 100644
--- a/builtin-branch.c
+++ b/builtin-branch.c
@@ -22,7 +22,7 @@ static const char builtin_branch_usage[] =
static const char *head;
static unsigned char head_sha1[20];
-static int branch_track_remotes = 1;
+static int branch_track = 1; /* 0 = none, 1 = remotes, 2 = all */
static int branch_use_color;
static char branch_colors[][COLOR_MAXLEN] = {
@@ -66,8 +66,12 @@ static int git_branch_config(const char *var, const char *value)
color_parse(value, var, branch_colors[slot]);
return 0;
}
- if (!strcmp(var, "branch.autosetupmerge"))
- branch_track_remotes = git_config_bool(var, value);
+ if (!strcmp(var, "branch.autosetupmerge")) {
+ if (!strcmp(value, "all"))
+ branch_track = 2;
+ else
+ branch_track = git_config_bool(var, value);
+ }
return git_default_config(var, value);
}
@@ -504,7 +508,9 @@ static void create_branch(const char *name, const char *start_name,
/* When branching off a remote branch, set up so that git-pull
automatically merges from there. So far, this is only done for
remotes registered via .git/config. */
- if (real_ref && track)
+ if (real_ref && (track == 2 ||
+ (track == 1 &&
+ !prefixcmp(real_ref, "refs/remotes/"))))
set_branch_defaults(name, real_ref);
if (write_ref_sha1(lock, sha1, msg) < 0)
@@ -564,7 +570,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
int i;
git_config(git_branch_config);
- track = branch_track_remotes;
+ track = branch_track;
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
@@ -576,7 +582,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
break;
}
if (!strcmp(arg, "--track")) {
- track = 1;
+ track = 2;
continue;
}
if (!strcmp(arg, "--no-track")) {
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index c6f472ac0..a19e961cb 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -148,6 +148,15 @@ test_expect_success 'test tracking setup via config' \
test $(git config branch.my3.remote) = local &&
test $(git config branch.my3.merge) = refs/heads/master'
+test_expect_success 'autosetupmerge = all' '
+ git config branch.autosetupmerge true &&
+ git branch all1 master &&
+ test -z "$(git config branch.all1.merge)" &&
+ git config branch.autosetupmerge all &&
+ git branch all2 master &&
+ test $(git config branch.all2.merge) = refs/heads/master
+'
+
test_expect_success 'test overriding tracking setup via --no-track' \
'git config branch.autosetupmerge true &&
git config remote.local.url . &&