@@ -51,6 +51,7 @@ static int option_progress = -1;
51
51
static enum transport_family family ;
52
52
static struct string_list option_config = STRING_LIST_INIT_NODUP ;
53
53
static struct string_list option_required_reference = STRING_LIST_INIT_NODUP ;
54
+ static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP ;
54
55
static int option_dissociate ;
55
56
static int max_jobs = -1 ;
56
57
@@ -81,6 +82,8 @@ static struct option builtin_clone_options[] = {
81
82
N_ ("directory from which templates will be used" )),
82
83
OPT_STRING_LIST (0 , "reference" , & option_required_reference , N_ ("repo" ),
83
84
N_ ("reference repository" )),
85
+ OPT_STRING_LIST (0 , "reference-if-able" , & option_optional_reference ,
86
+ N_ ("repo" ), N_ ("reference repository" )),
84
87
OPT_BOOL (0 , "dissociate" , & option_dissociate ,
85
88
N_ ("use --reference only while cloning" )),
86
89
OPT_STRING ('o' , "origin" , & option_origin , N_ ("name" ),
@@ -283,24 +286,36 @@ static void strip_trailing_slashes(char *dir)
283
286
static int add_one_reference (struct string_list_item * item , void * cb_data )
284
287
{
285
288
struct strbuf err = STRBUF_INIT ;
286
- struct strbuf sb = STRBUF_INIT ;
289
+ int * required = cb_data ;
287
290
char * ref_git = compute_alternate_path (item -> string , & err );
288
291
289
- if (!ref_git )
290
- die ("%s" , err .buf );
291
-
292
- strbuf_addf (& sb , "%s/objects" , ref_git );
293
- add_to_alternates_file (sb .buf );
292
+ if (!ref_git ) {
293
+ if (* required )
294
+ die ("%s" , err .buf );
295
+ else
296
+ fprintf (stderr ,
297
+ _ ("info: Could not add alternate for '%s': %s\n" ),
298
+ item -> string , err .buf );
299
+ } else {
300
+ struct strbuf sb = STRBUF_INIT ;
301
+ strbuf_addf (& sb , "%s/objects" , ref_git );
302
+ add_to_alternates_file (sb .buf );
303
+ strbuf_release (& sb );
304
+ }
294
305
295
- free (ref_git );
296
306
strbuf_release (& err );
297
- strbuf_release ( & sb );
307
+ free ( ref_git );
298
308
return 0 ;
299
309
}
300
310
301
311
static void setup_reference (void )
302
312
{
303
- for_each_string_list (& option_required_reference , add_one_reference , NULL );
313
+ int required = 1 ;
314
+ for_each_string_list (& option_required_reference ,
315
+ add_one_reference , & required );
316
+ required = 0 ;
317
+ for_each_string_list (& option_optional_reference ,
318
+ add_one_reference , & required );
304
319
}
305
320
306
321
static void copy_alternates (struct strbuf * src , struct strbuf * dst ,
@@ -952,7 +967,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
952
967
git_config_set (key .buf , repo );
953
968
strbuf_reset (& key );
954
969
955
- if (option_required_reference .nr )
970
+ if (option_required_reference .nr || option_optional_reference . nr )
956
971
setup_reference ();
957
972
958
973
fetch_pattern = value .buf ;
0 commit comments