@@ -37,7 +37,8 @@ static int find_tracked_branch(struct remote *remote, void *priv)
3737 * to infer the settings for branch.<new_ref>.{remote,merge} from the
3838 * config.
3939 */
40- static int setup_tracking (const char * new_ref , const char * orig_ref )
40+ static int setup_tracking (const char * new_ref , const char * orig_ref ,
41+ enum branch_track track )
4142{
4243 char key [1024 ];
4344 struct tracking tracking ;
@@ -48,30 +49,36 @@ static int setup_tracking(const char *new_ref, const char *orig_ref)
4849
4950 memset (& tracking , 0 , sizeof (tracking ));
5051 tracking .spec .dst = (char * )orig_ref ;
51- if (for_each_remote (find_tracked_branch , & tracking ) ||
52- !tracking .matches )
52+ if (for_each_remote (find_tracked_branch , & tracking ))
5353 return 1 ;
5454
55+ if (!tracking .matches )
56+ switch (track ) {
57+ case BRANCH_TRACK_ALWAYS :
58+ case BRANCH_TRACK_EXPLICIT :
59+ break ;
60+ default :
61+ return 1 ;
62+ }
63+
5564 if (tracking .matches > 1 )
5665 return error ("Not tracking: ambiguous information for ref %s" ,
5766 orig_ref );
5867
59- if (tracking .matches == 1 ) {
60- sprintf (key , "branch.%s.remote" , new_ref );
61- git_config_set (key , tracking .remote ? tracking .remote : "." );
62- sprintf (key , "branch.%s.merge" , new_ref );
63- git_config_set (key , tracking .src );
64- free (tracking .src );
65- printf ("Branch %s set up to track remote branch %s.\n" ,
66- new_ref , orig_ref );
67- }
68+ sprintf (key , "branch.%s.remote" , new_ref );
69+ git_config_set (key , tracking .remote ? tracking .remote : "." );
70+ sprintf (key , "branch.%s.merge" , new_ref );
71+ git_config_set (key , tracking .src ? tracking .src : orig_ref );
72+ free (tracking .src );
73+ printf ("Branch %s set up to track %s branch %s.\n" , new_ref ,
74+ tracking .remote ? "remote" : "local" , orig_ref );
6875
6976 return 0 ;
7077}
7178
7279void create_branch (const char * head ,
7380 const char * name , const char * start_name ,
74- int force , int reflog , int track )
81+ int force , int reflog , enum branch_track track )
7582{
7683 struct ref_lock * lock ;
7784 struct commit * commit ;
@@ -98,7 +105,8 @@ void create_branch(const char *head,
98105 switch (dwim_ref (start_name , strlen (start_name ), sha1 , & real_ref )) {
99106 case 0 :
100107 /* Not branching from any existing branch */
101- real_ref = NULL ;
108+ if (track == BRANCH_TRACK_EXPLICIT )
109+ die ("Cannot setup tracking information; starting point is not a branch." );
102110 break ;
103111 case 1 :
104112 /* Unique completion -- good */
@@ -126,17 +134,13 @@ void create_branch(const char *head,
126134 snprintf (msg , sizeof msg , "branch: Created from %s" ,
127135 start_name );
128136
129- /* When branching off a remote branch, set up so that git-pull
130- automatically merges from there. So far, this is only done for
131- remotes registered via .git/config. */
132137 if (real_ref && track )
133- setup_tracking (name , real_ref );
138+ setup_tracking (name , real_ref , track );
134139
135140 if (write_ref_sha1 (lock , sha1 , msg ) < 0 )
136141 die ("Failed to write ref: %s." , strerror (errno ));
137142
138- if (real_ref )
139- free (real_ref );
143+ free (real_ref );
140144}
141145
142146void remove_branch_state (void )
0 commit comments