Skip to contentSkip to conversation

git-branch: add --track and --no-track options

PATCH New Paolo Bonzini 1 participant 1 message Jun 15, 2016 Documentation

lore
Share & tools
lore
#0 lore raw

PATCH 1/3 git-branch: add --track and --no-track options

In order to track and build on top of a branch 'topic' you track from your upstream repository, you often would end up doing this sequence:

  git checkout -b mytopic origin/topic
  git config --add branch.mytopic.remote origin
  git config --add branch.mytopic.merge refs/heads/topic

This would first fork your own 'mytopic' branch from the 'topic' branch you track from the 'origin' repository; then it would set up two configuration variables so that 'git pull' without parameters does the right thing while you are on your own 'mytopic' branch.

This commit adds a --track option to git-branch, so that "git branch --track mytopic origin/topic" performs the latter two actions when creating your 'mytopic' branch.

If the configuration variable remote.NAME.trackintolocalbranches is set to true, you do not have to pass the --track option explicitly; further patches in this series allow setting the variable with a "git remote add" option. The configuration variable is off by default, and there is a --no-track option to countermand it even if the variable is set.

---
 Documentation/git-branch.txt |    9 ++-
 builtin-branch.c             |  126 ++++++++++++++++++++++++++++++++++++++++---
 cache.h                      |    1 
 trace.c                      |   14 ++--
 4 files changed, 134 insertions(+), 16 deletions(-)

This version provides a variable-argument wrapper nfasprintf around the git function nfvasprintf, and uses it instead of the GNU extension asprintf.

Documentation/git-branch.txt +8 -1
index 3ea3b80..bd65b98 100644
@@ -10,7 +10,7 @@ SYNOPSIS
 [verse]
 'git-branch' [--color | --no-color] [-r | -a]
 	   [-v [--abbrev=<length> | --no-abbrev]]
-'git-branch' [-l] [-f] <branchname> [<start-point>]
+'git-branch' [--track | --no-track] [-l] [-f] <branchname> [<start-point>]
 'git-branch' (-m | -M) [<oldbranch>] <newbranch>
 'git-branch' (-d | -D) [-r] <branchname>...
 
@@ -26,6 +26,13 @@ It will start out with a head equal to the one given as <start-point>.
 If no <start-point> is given, the branch will be created with a head
 equal to that of the currently checked out branch.
 
+When a local branch is started off a remote branch, git can setup the
+branch so that gitlink:git-pull[1] will appropriately merge from that
+remote branch.  If this behavior is desired, it is possible to make it
+the default using the `trackintolocalbranches` option of the
+corresponding remote.  Otherwise, it can be chosen per-branch using
+the `--track` and `--no-track` options.
+
 With a '-m' or '-M' option, <oldbranch> will be renamed to <newbranch>.
 If <oldbranch> had a corresponding reflog, it is renamed to match
 <newbranch>, and a reflog entry is created to remember the branch
builtin-branch.c +113 -7

171 lines not on this page · raw message

cache.h +1 -0
index 8018b2c..e1b8416 100644
@@ -477,6 +477,7 @@ extern struct tag *alloc_tag_node(void);
 extern void alloc_report(void);
 
 /* trace.c */
+extern int nfasprintf(char **str, const char *fmt, ...);
 extern int nfvasprintf(char **str, const char *fmt, va_list va);
 extern void trace_printf(const char *format, ...);
 extern void trace_argv_printf(const char **argv, int count, const char *format, ...);
trace.c +6 -8
index 27fef86..ab177fa 100644
@@ -26,14 +26,14 @@
 #include "quote.h"
 
 /* Stolen from "imap-send.c". */
-static int git_vasprintf(char **strp, const char *fmt, va_list ap)
+int nfvasprintf(char **strp, const char *fmt, va_list ap)
 {
 	int len;
 	char tmp[1024];
 
 	if ((len = vsnprintf(tmp, sizeof(tmp), fmt, ap)) < 0 ||
 	    !(*strp = xmalloc(len + 1)))
-		return -1;
+		die("Fatal: Out of memory\n");
 	if (len >= (int)sizeof(tmp))
 		vsprintf(*strp, fmt, ap);
 	else
@@ -41,13 +41,11 @@ static int git_vasprintf(char **strp, const char *fmt, va_list ap)
 	return len;
 }
 
-/* Stolen from "imap-send.c". */
-int nfvasprintf(char **str, const char *fmt, va_list va)
+int nfasprintf(char **str, const char *fmt, ...)
 {
-	int ret = git_vasprintf(str, fmt, va);
-	if (ret < 0)
-		die("Fatal: Out of memory\n");
-	return ret;
+	va_list args;
+	va_start(args, fmt);
+	return nfvasprintf(str, fmt, args);
 }
 
 /* Get a trace file descriptor from GIT_TRACE env variable. */