8 #include "environment.h"
12 #include "run-command.h"
14 #include "transport.h"
15 #include "parse-options.h"
17 #include "repository.h"
18 #include "submodule.h"
19 #include "submodule-config.h"
20 #include "send-pack.h"
24 static const char * const push_usage
[] = {
25 N_("git push [<options>] [<repository> [<refspec>...]]"),
29 static int push_use_color
= -1;
30 static char push_colors
[][COLOR_MAXLEN
] = {
32 GIT_COLOR_RED
, /* ERROR */
40 static int parse_push_color_slot(const char *slot
)
42 if (!strcasecmp(slot
, "reset"))
43 return PUSH_COLOR_RESET
;
44 if (!strcasecmp(slot
, "error"))
45 return PUSH_COLOR_ERROR
;
49 static const char *push_get_color(enum color_push ix
)
51 if (want_color_stderr(push_use_color
))
52 return push_colors
[ix
];
57 static int deleterefs
;
58 static const char *receivepack
;
60 static int progress
= -1;
61 static int recurse_submodules
= RECURSE_SUBMODULES_DEFAULT
;
62 static enum transport_family family
;
64 static struct push_cas_option cas
;
66 static struct refspec rs
= REFSPEC_INIT_PUSH
;
68 static struct string_list push_options_config
= STRING_LIST_INIT_DUP
;
70 static void refspec_append_mapped(struct refspec
*refspec
, const char *ref
,
71 struct remote
*remote
, struct ref
*matched
)
73 const char *branch_name
;
75 if (remote
->push
.nr
) {
76 struct refspec_item query
;
77 memset(&query
, 0, sizeof(struct refspec_item
));
78 query
.src
= matched
->name
;
79 if (!query_refspecs(&remote
->push
, &query
) && query
.dst
) {
80 refspec_appendf(refspec
, "%s%s:%s",
81 query
.force
? "+" : "",
82 query
.src
, query
.dst
);
87 if (push_default
== PUSH_DEFAULT_UPSTREAM
&&
88 skip_prefix(matched
->name
, "refs/heads/", &branch_name
)) {
89 struct branch
*branch
= branch_get(branch_name
);
90 if (branch
->merge_nr
== 1 && branch
->merge
[0]->src
) {
91 refspec_appendf(refspec
, "%s:%s",
92 ref
, branch
->merge
[0]->src
);
97 refspec_append(refspec
, ref
);
100 static void set_refspecs(const char **refs
, int nr
, const char *repo
)
102 struct remote
*remote
= NULL
;
103 struct ref
*local_refs
= NULL
;
106 for (i
= 0; i
< nr
; i
++) {
107 const char *ref
= refs
[i
];
108 if (!strcmp("tag", ref
)) {
110 die(_("tag shorthand without <tag>"));
113 refspec_appendf(&rs
, ":refs/tags/%s", ref
);
115 refspec_appendf(&rs
, "refs/tags/%s", ref
);
116 } else if (deleterefs
) {
117 if (strchr(ref
, ':') || !*ref
)
118 die(_("--delete only accepts plain target ref names"));
119 refspec_appendf(&rs
, ":%s", ref
);
120 } else if (!strchr(ref
, ':')) {
121 struct ref
*matched
= NULL
;
123 /* lazily grab local_refs */
125 local_refs
= get_local_heads();
127 /* Does "ref" uniquely name our ref? */
128 if (count_refspec_match(ref
, local_refs
, &matched
) != 1) {
129 refspec_append(&rs
, ref
);
131 /* lazily grab remote */
133 remote
= remote_get(repo
);
135 BUG("must get a remote for repo '%s'", repo
);
137 refspec_append_mapped(&rs
, ref
, remote
, matched
);
140 refspec_append(&rs
, ref
);
142 free_refs(local_refs
);
145 static int push_url_of_remote(struct remote
*remote
, const char ***url_p
)
147 if (remote
->pushurl_nr
) {
148 *url_p
= remote
->pushurl
;
149 return remote
->pushurl_nr
;
151 *url_p
= remote
->url
;
152 return remote
->url_nr
;
155 static NORETURN
void die_push_simple(struct branch
*branch
,
156 struct remote
*remote
)
159 * There's no point in using shorten_unambiguous_ref here,
160 * as the ambiguity would be on the remote side, not what
161 * we have locally. Plus, this is supposed to be the simple
162 * mode. If the user is doing something crazy like setting
163 * upstream to a non-branch, we should probably be showing
164 * them the big ugly fully qualified ref.
166 const char *advice_pushdefault_maybe
= "";
167 const char *advice_automergesimple_maybe
= "";
168 const char *short_upstream
= branch
->merge
[0]->src
;
170 skip_prefix(short_upstream
, "refs/heads/", &short_upstream
);
173 * Don't show advice for people who explicitly set
176 if (push_default
== PUSH_DEFAULT_UNSPECIFIED
)
177 advice_pushdefault_maybe
= _("\n"
178 "To choose either option permanently, "
179 "see push.default in 'git help config'.\n");
180 if (git_branch_track
!= BRANCH_TRACK_SIMPLE
)
181 advice_automergesimple_maybe
= _("\n"
182 "To avoid automatically configuring "
183 "an upstream branch when its name\n"
184 "won't match the local branch, see option "
185 "'simple' of branch.autoSetupMerge\n"
186 "in 'git help config'.\n");
187 die(_("The upstream branch of your current branch does not match\n"
188 "the name of your current branch. To push to the upstream branch\n"
189 "on the remote, use\n"
191 " git push %s HEAD:%s\n"
193 "To push to the branch of the same name on the remote, use\n"
195 " git push %s HEAD\n"
197 remote
->name
, short_upstream
,
198 remote
->name
, advice_pushdefault_maybe
,
199 advice_automergesimple_maybe
);
202 static const char message_detached_head_die
[] =
203 N_("You are not currently on a branch.\n"
204 "To push the history leading to the current (detached HEAD)\n"
207 " git push %s HEAD:<name-of-remote-branch>\n");
209 static const char *get_upstream_ref(int flags
, struct branch
*branch
, const char *remote_name
)
211 if (branch
->merge_nr
== 0 && (flags
& TRANSPORT_PUSH_AUTO_UPSTREAM
)) {
212 /* if missing, assume same; set_upstream will be defined later */
213 return branch
->refname
;
216 if (!branch
->merge_nr
|| !branch
->merge
|| !branch
->remote_name
) {
217 const char *advice_autosetup_maybe
= "";
218 if (!(flags
& TRANSPORT_PUSH_AUTO_UPSTREAM
)) {
219 advice_autosetup_maybe
= _("\n"
220 "To have this happen automatically for "
221 "branches without a tracking\n"
222 "upstream, see 'push.autoSetupRemote' "
223 "in 'git help config'.\n");
225 die(_("The current branch %s has no upstream branch.\n"
226 "To push the current branch and set the remote as upstream, use\n"
228 " git push --set-upstream %s %s\n"
233 advice_autosetup_maybe
);
235 if (branch
->merge_nr
!= 1)
236 die(_("The current branch %s has multiple upstream branches, "
237 "refusing to push."), branch
->name
);
239 return branch
->merge
[0]->src
;
242 static void setup_default_push_refspecs(int *flags
, struct remote
*remote
)
244 struct branch
*branch
;
248 switch (push_default
) {
249 case PUSH_DEFAULT_MATCHING
:
250 refspec_append(&rs
, ":");
253 case PUSH_DEFAULT_NOTHING
:
254 die(_("You didn't specify any refspecs to push, and "
255 "push.default is \"nothing\"."));
261 branch
= branch_get(NULL
);
263 die(_(message_detached_head_die
), remote
->name
);
265 dst
= branch
->refname
;
266 same_remote
= !strcmp(remote
->name
, remote_for_branch(branch
, NULL
));
268 switch (push_default
) {
270 case PUSH_DEFAULT_UNSPECIFIED
:
271 case PUSH_DEFAULT_SIMPLE
:
274 if (strcmp(branch
->refname
, get_upstream_ref(*flags
, branch
, remote
->name
)))
275 die_push_simple(branch
, remote
);
278 case PUSH_DEFAULT_UPSTREAM
:
280 die(_("You are pushing to remote '%s', which is not the upstream of\n"
281 "your current branch '%s', without telling me what to push\n"
282 "to update which remote branch."),
283 remote
->name
, branch
->name
);
284 dst
= get_upstream_ref(*flags
, branch
, remote
->name
);
287 case PUSH_DEFAULT_CURRENT
:
292 * this is a default push - if auto-upstream is enabled and there is
293 * no upstream defined, then set it (with options 'simple', 'upstream',
296 if ((*flags
& TRANSPORT_PUSH_AUTO_UPSTREAM
) && branch
->merge_nr
== 0)
297 *flags
|= TRANSPORT_PUSH_SET_UPSTREAM
;
299 refspec_appendf(&rs
, "%s:%s", branch
->refname
, dst
);
302 static const char message_advice_pull_before_push
[] =
303 N_("Updates were rejected because the tip of your current branch is behind\n"
304 "its remote counterpart. If you want to integrate the remote changes,\n"
305 "use 'git pull' before pushing again.\n"
306 "See the 'Note about fast-forwards' in 'git push --help' for details.");
308 static const char message_advice_checkout_pull_push
[] =
309 N_("Updates were rejected because a pushed branch tip is behind its remote\n"
310 "counterpart. If you want to integrate the remote changes, use 'git pull'\n"
311 "before pushing again.\n"
312 "See the 'Note about fast-forwards' in 'git push --help' for details.");
314 static const char message_advice_ref_fetch_first
[] =
315 N_("Updates were rejected because the remote contains work that you do not\n"
316 "have locally. This is usually caused by another repository pushing to\n"
317 "the same ref. If you want to integrate the remote changes, use\n"
318 "'git pull' before pushing again.\n"
319 "See the 'Note about fast-forwards' in 'git push --help' for details.");
321 static const char message_advice_ref_already_exists
[] =
322 N_("Updates were rejected because the tag already exists in the remote.");
324 static const char message_advice_ref_needs_force
[] =
325 N_("You cannot update a remote ref that points at a non-commit object,\n"
326 "or update a remote ref to make it point at a non-commit object,\n"
327 "without using the '--force' option.\n");
329 static const char message_advice_ref_needs_update
[] =
330 N_("Updates were rejected because the tip of the remote-tracking branch has\n"
331 "been updated since the last checkout. If you want to integrate the\n"
332 "remote changes, use 'git pull' before pushing again.\n"
333 "See the 'Note about fast-forwards' in 'git push --help' for details.");
335 static void advise_pull_before_push(void)
337 if (!advice_enabled(ADVICE_PUSH_NON_FF_CURRENT
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
339 advise(_(message_advice_pull_before_push
));
342 static void advise_checkout_pull_push(void)
344 if (!advice_enabled(ADVICE_PUSH_NON_FF_MATCHING
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
346 advise(_(message_advice_checkout_pull_push
));
349 static void advise_ref_already_exists(void)
351 if (!advice_enabled(ADVICE_PUSH_ALREADY_EXISTS
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
353 advise(_(message_advice_ref_already_exists
));
356 static void advise_ref_fetch_first(void)
358 if (!advice_enabled(ADVICE_PUSH_FETCH_FIRST
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
360 advise(_(message_advice_ref_fetch_first
));
363 static void advise_ref_needs_force(void)
365 if (!advice_enabled(ADVICE_PUSH_NEEDS_FORCE
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
367 advise(_(message_advice_ref_needs_force
));
370 static void advise_ref_needs_update(void)
372 if (!advice_enabled(ADVICE_PUSH_REF_NEEDS_UPDATE
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
374 advise(_(message_advice_ref_needs_update
));
377 static int push_with_options(struct transport
*transport
, struct refspec
*rs
,
381 unsigned int reject_reasons
;
382 char *anon_url
= transport_anonymize_url(transport
->url
);
384 transport_set_verbosity(transport
, verbosity
, progress
);
385 transport
->family
= family
;
388 transport_set_option(transport
,
389 TRANS_OPT_RECEIVEPACK
, receivepack
);
390 transport_set_option(transport
, TRANS_OPT_THIN
, thin
? "yes" : NULL
);
392 if (!is_empty_cas(&cas
)) {
393 if (!transport
->smart_options
)
394 die("underlying transport does not support --%s option",
396 transport
->smart_options
->cas
= &cas
;
400 fprintf(stderr
, _("Pushing to %s\n"), anon_url
);
401 trace2_region_enter("push", "transport_push", the_repository
);
402 err
= transport_push(the_repository
, transport
,
403 rs
, flags
, &reject_reasons
);
404 trace2_region_leave("push", "transport_push", the_repository
);
406 fprintf(stderr
, "%s", push_get_color(PUSH_COLOR_ERROR
));
407 error(_("failed to push some refs to '%s'"), anon_url
);
408 fprintf(stderr
, "%s", push_get_color(PUSH_COLOR_RESET
));
411 err
|= transport_disconnect(transport
);
416 if (reject_reasons
& REJECT_NON_FF_HEAD
) {
417 advise_pull_before_push();
418 } else if (reject_reasons
& REJECT_NON_FF_OTHER
) {
419 advise_checkout_pull_push();
420 } else if (reject_reasons
& REJECT_ALREADY_EXISTS
) {
421 advise_ref_already_exists();
422 } else if (reject_reasons
& REJECT_FETCH_FIRST
) {
423 advise_ref_fetch_first();
424 } else if (reject_reasons
& REJECT_NEEDS_FORCE
) {
425 advise_ref_needs_force();
426 } else if (reject_reasons
& REJECT_REF_NEEDS_UPDATE
) {
427 advise_ref_needs_update();
433 static int do_push(int flags
,
434 const struct string_list
*push_options
,
435 struct remote
*remote
)
440 struct refspec
*push_refspec
= &rs
;
442 if (push_options
->nr
)
443 flags
|= TRANSPORT_PUSH_OPTIONS
;
445 if (!push_refspec
->nr
&& !(flags
& TRANSPORT_PUSH_ALL
)) {
446 if (remote
->push
.nr
) {
447 push_refspec
= &remote
->push
;
448 } else if (!(flags
& TRANSPORT_PUSH_MIRROR
))
449 setup_default_push_refspecs(&flags
, remote
);
452 url_nr
= push_url_of_remote(remote
, &url
);
454 for (i
= 0; i
< url_nr
; i
++) {
455 struct transport
*transport
=
456 transport_get(remote
, url
[i
]);
457 if (flags
& TRANSPORT_PUSH_OPTIONS
)
458 transport
->push_options
= push_options
;
459 if (push_with_options(transport
, push_refspec
, flags
))
463 struct transport
*transport
=
464 transport_get(remote
, NULL
);
465 if (flags
& TRANSPORT_PUSH_OPTIONS
)
466 transport
->push_options
= push_options
;
467 if (push_with_options(transport
, push_refspec
, flags
))
473 static int option_parse_recurse_submodules(const struct option
*opt
,
474 const char *arg
, int unset
)
476 int *recurse_submodules
= opt
->value
;
479 *recurse_submodules
= RECURSE_SUBMODULES_OFF
;
481 if (!strcmp(arg
, "only-is-on-demand")) {
482 if (*recurse_submodules
== RECURSE_SUBMODULES_ONLY
) {
483 warning(_("recursing into submodule with push.recurseSubmodules=only; using on-demand instead"));
484 *recurse_submodules
= RECURSE_SUBMODULES_ON_DEMAND
;
487 *recurse_submodules
= parse_push_recurse_submodules_arg(opt
->long_name
, arg
);
494 static void set_push_cert_flags(int *flags
, int v
)
497 case SEND_PACK_PUSH_CERT_NEVER
:
498 *flags
&= ~(TRANSPORT_PUSH_CERT_ALWAYS
| TRANSPORT_PUSH_CERT_IF_ASKED
);
500 case SEND_PACK_PUSH_CERT_ALWAYS
:
501 *flags
|= TRANSPORT_PUSH_CERT_ALWAYS
;
502 *flags
&= ~TRANSPORT_PUSH_CERT_IF_ASKED
;
504 case SEND_PACK_PUSH_CERT_IF_ASKED
:
505 *flags
|= TRANSPORT_PUSH_CERT_IF_ASKED
;
506 *flags
&= ~TRANSPORT_PUSH_CERT_ALWAYS
;
512 static int git_push_config(const char *k
, const char *v
,
513 const struct config_context
*ctx
, void *cb
)
515 const char *slot_name
;
518 if (!strcmp(k
, "push.followtags")) {
519 if (git_config_bool(k
, v
))
520 *flags
|= TRANSPORT_PUSH_FOLLOW_TAGS
;
522 *flags
&= ~TRANSPORT_PUSH_FOLLOW_TAGS
;
524 } else if (!strcmp(k
, "push.autosetupremote")) {
525 if (git_config_bool(k
, v
))
526 *flags
|= TRANSPORT_PUSH_AUTO_UPSTREAM
;
528 } else if (!strcmp(k
, "push.gpgsign")) {
530 if (!git_config_get_value("push.gpgsign", &value
)) {
531 switch (git_parse_maybe_bool(value
)) {
533 set_push_cert_flags(flags
, SEND_PACK_PUSH_CERT_NEVER
);
536 set_push_cert_flags(flags
, SEND_PACK_PUSH_CERT_ALWAYS
);
539 if (value
&& !strcasecmp(value
, "if-asked"))
540 set_push_cert_flags(flags
, SEND_PACK_PUSH_CERT_IF_ASKED
);
542 return error(_("invalid value for '%s'"), k
);
545 } else if (!strcmp(k
, "push.recursesubmodules")) {
547 if (!git_config_get_value("push.recursesubmodules", &value
))
548 recurse_submodules
= parse_push_recurse_submodules_arg(k
, value
);
549 } else if (!strcmp(k
, "submodule.recurse")) {
550 int val
= git_config_bool(k
, v
) ?
551 RECURSE_SUBMODULES_ON_DEMAND
: RECURSE_SUBMODULES_OFF
;
552 recurse_submodules
= val
;
553 } else if (!strcmp(k
, "push.pushoption")) {
555 return config_error_nonbool(k
);
558 string_list_clear(&push_options_config
, 0);
560 string_list_append(&push_options_config
, v
);
562 } else if (!strcmp(k
, "color.push")) {
563 push_use_color
= git_config_colorbool(k
, v
);
565 } else if (skip_prefix(k
, "color.push.", &slot_name
)) {
566 int slot
= parse_push_color_slot(slot_name
);
570 return config_error_nonbool(k
);
571 return color_parse(v
, push_colors
[slot
]);
572 } else if (!strcmp(k
, "push.useforceifincludes")) {
573 if (git_config_bool(k
, v
))
574 *flags
|= TRANSPORT_PUSH_FORCE_IF_INCLUDES
;
576 *flags
&= ~TRANSPORT_PUSH_FORCE_IF_INCLUDES
;
580 return git_default_config(k
, v
, ctx
, NULL
);
583 int cmd_push(int argc
, const char **argv
, const char *prefix
)
589 const char *repo
= NULL
; /* default repository */
590 struct string_list push_options_cmdline
= STRING_LIST_INIT_DUP
;
591 struct string_list
*push_options
;
592 const struct string_list_item
*item
;
593 struct remote
*remote
;
595 struct option options
[] = {
596 OPT__VERBOSITY(&verbosity
),
597 OPT_STRING( 0 , "repo", &repo
, N_("repository"), N_("repository")),
598 OPT_BIT( 0 , "all", &flags
, N_("push all branches"), TRANSPORT_PUSH_ALL
),
599 OPT_ALIAS( 0 , "branches", "all"),
600 OPT_BIT( 0 , "mirror", &flags
, N_("mirror all refs"),
601 (TRANSPORT_PUSH_MIRROR
|TRANSPORT_PUSH_FORCE
)),
602 OPT_BOOL('d', "delete", &deleterefs
, N_("delete refs")),
603 OPT_BOOL( 0 , "tags", &tags
, N_("push tags (can't be used with --all or --branches or --mirror)")),
604 OPT_BIT('n' , "dry-run", &flags
, N_("dry run"), TRANSPORT_PUSH_DRY_RUN
),
605 OPT_BIT( 0, "porcelain", &flags
, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN
),
606 OPT_BIT('f', "force", &flags
, N_("force updates"), TRANSPORT_PUSH_FORCE
),
607 OPT_CALLBACK_F(0, CAS_OPT_NAME
, &cas
, N_("<refname>:<expect>"),
608 N_("require old value of ref to be at this value"),
609 PARSE_OPT_OPTARG
| PARSE_OPT_LITERAL_ARGHELP
, parseopt_push_cas_option
),
610 OPT_BIT(0, TRANS_OPT_FORCE_IF_INCLUDES
, &flags
,
611 N_("require remote updates to be integrated locally"),
612 TRANSPORT_PUSH_FORCE_IF_INCLUDES
),
613 OPT_CALLBACK(0, "recurse-submodules", &recurse_submodules
, "(check|on-demand|no)",
614 N_("control recursive pushing of submodules"), option_parse_recurse_submodules
),
615 OPT_BOOL_F( 0 , "thin", &thin
, N_("use thin pack"), PARSE_OPT_NOCOMPLETE
),
616 OPT_STRING( 0 , "receive-pack", &receivepack
, "receive-pack", N_("receive pack program")),
617 OPT_STRING( 0 , "exec", &receivepack
, "receive-pack", N_("receive pack program")),
618 OPT_BIT('u', "set-upstream", &flags
, N_("set upstream for git pull/status"),
619 TRANSPORT_PUSH_SET_UPSTREAM
),
620 OPT_BOOL(0, "progress", &progress
, N_("force progress reporting")),
621 OPT_BIT(0, "prune", &flags
, N_("prune locally removed refs"),
622 TRANSPORT_PUSH_PRUNE
),
623 OPT_BIT(0, "no-verify", &flags
, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK
),
624 OPT_BIT(0, "follow-tags", &flags
, N_("push missing but relevant tags"),
625 TRANSPORT_PUSH_FOLLOW_TAGS
),
626 OPT_CALLBACK_F(0, "signed", &push_cert
, "(yes|no|if-asked)", N_("GPG sign the push"),
627 PARSE_OPT_OPTARG
, option_parse_push_signed
),
628 OPT_BIT(0, "atomic", &flags
, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC
),
629 OPT_STRING_LIST('o', "push-option", &push_options_cmdline
, N_("server-specific"), N_("option to transmit")),
630 OPT_SET_INT('4', "ipv4", &family
, N_("use IPv4 addresses only"),
631 TRANSPORT_FAMILY_IPV4
),
632 OPT_SET_INT('6', "ipv6", &family
, N_("use IPv6 addresses only"),
633 TRANSPORT_FAMILY_IPV6
),
637 packet_trace_identity("push");
638 git_config(git_push_config
, &flags
);
639 argc
= parse_options(argc
, argv
, prefix
, options
, push_usage
, 0);
640 push_options
= (push_options_cmdline
.nr
641 ? &push_options_cmdline
642 : &push_options_config
);
643 set_push_cert_flags(&flags
, push_cert
);
645 if (deleterefs
&& (tags
|| (flags
& (TRANSPORT_PUSH_ALL
| TRANSPORT_PUSH_MIRROR
))))
646 die(_("options '%s' and '%s' cannot be used together"), "--delete", "--all/--branches/--mirror/--tags");
647 if (deleterefs
&& argc
< 2)
648 die(_("--delete doesn't make sense without any refs"));
650 if (recurse_submodules
== RECURSE_SUBMODULES_CHECK
)
651 flags
|= TRANSPORT_RECURSE_SUBMODULES_CHECK
;
652 else if (recurse_submodules
== RECURSE_SUBMODULES_ON_DEMAND
)
653 flags
|= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND
;
654 else if (recurse_submodules
== RECURSE_SUBMODULES_ONLY
)
655 flags
|= TRANSPORT_RECURSE_SUBMODULES_ONLY
;
658 refspec_append(&rs
, "refs/tags/*");
662 set_refspecs(argv
+ 1, argc
- 1, repo
);
665 remote
= pushremote_get(repo
);
668 die(_("bad repository '%s'"), repo
);
669 die(_("No configured push destination.\n"
670 "Either specify the URL from the command-line or configure a remote repository using\n"
672 " git remote add <name> <url>\n"
674 "and then push using the remote name\n"
676 " git push <name>\n"));
680 flags
|= (TRANSPORT_PUSH_MIRROR
|TRANSPORT_PUSH_FORCE
);
682 if (flags
& TRANSPORT_PUSH_ALL
) {
684 die(_("options '%s' and '%s' cannot be used together"), "--all", "--tags");
686 die(_("--all can't be combined with refspecs"));
688 if (flags
& TRANSPORT_PUSH_MIRROR
) {
690 die(_("options '%s' and '%s' cannot be used together"), "--mirror", "--tags");
692 die(_("--mirror can't be combined with refspecs"));
694 if ((flags
& TRANSPORT_PUSH_ALL
) && (flags
& TRANSPORT_PUSH_MIRROR
))
695 die(_("options '%s' and '%s' cannot be used together"), "--all", "--mirror");
697 if (!is_empty_cas(&cas
) && (flags
& TRANSPORT_PUSH_FORCE_IF_INCLUDES
))
698 cas
.use_force_if_includes
= 1;
700 for_each_string_list_item(item
, push_options
)
701 if (strchr(item
->string
, '\n'))
702 die(_("push options must not have new line characters"));
704 rc
= do_push(flags
, push_options
, remote
);
705 string_list_clear(&push_options_cmdline
, 0);
706 string_list_clear(&push_options_config
, 0);
708 usage_with_options(push_usage
, options
);