8 #include "run-command.h"
11 #include "transport.h"
12 #include "parse-options.h"
13 #include "submodule.h"
14 #include "submodule-config.h"
15 #include "send-pack.h"
18 static const char * const push_usage
[] = {
19 N_("git push [<options>] [<repository> [<refspec>...]]"),
23 static int push_use_color
= -1;
24 static char push_colors
[][COLOR_MAXLEN
] = {
26 GIT_COLOR_RED
, /* ERROR */
34 static int parse_push_color_slot(const char *slot
)
36 if (!strcasecmp(slot
, "reset"))
37 return PUSH_COLOR_RESET
;
38 if (!strcasecmp(slot
, "error"))
39 return PUSH_COLOR_ERROR
;
43 static const char *push_get_color(enum color_push ix
)
45 if (want_color_stderr(push_use_color
))
46 return push_colors
[ix
];
51 static int deleterefs
;
52 static const char *receivepack
;
54 static int progress
= -1;
55 static int recurse_submodules
= RECURSE_SUBMODULES_DEFAULT
;
56 static enum transport_family family
;
58 static struct push_cas_option cas
;
60 static struct refspec rs
= REFSPEC_INIT_PUSH
;
62 static struct string_list push_options_config
= STRING_LIST_INIT_DUP
;
64 static void refspec_append_mapped(struct refspec
*refspec
, const char *ref
,
65 struct remote
*remote
, struct ref
*local_refs
)
67 const char *branch_name
;
68 struct ref
*matched
= NULL
;
70 /* Does "ref" uniquely name our ref? */
71 if (count_refspec_match(ref
, local_refs
, &matched
) != 1) {
72 refspec_append(refspec
, ref
);
76 if (remote
->push
.nr
) {
77 struct refspec_item query
;
78 memset(&query
, 0, sizeof(struct refspec_item
));
79 query
.src
= matched
->name
;
80 if (!query_refspecs(&remote
->push
, &query
) && query
.dst
) {
81 refspec_appendf(refspec
, "%s%s:%s",
82 query
.force
? "+" : "",
83 query
.src
, query
.dst
);
88 if (push_default
== PUSH_DEFAULT_UPSTREAM
&&
89 skip_prefix(matched
->name
, "refs/heads/", &branch_name
)) {
90 struct branch
*branch
= branch_get(branch_name
);
91 if (branch
->merge_nr
== 1 && branch
->merge
[0]->src
) {
92 refspec_appendf(refspec
, "%s:%s",
93 ref
, branch
->merge
[0]->src
);
98 refspec_append(refspec
, ref
);
101 static void set_refspecs(const char **refs
, int nr
, const char *repo
)
103 struct remote
*remote
= NULL
;
104 struct ref
*local_refs
= NULL
;
107 for (i
= 0; i
< nr
; i
++) {
108 const char *ref
= refs
[i
];
109 if (!strcmp("tag", ref
)) {
111 die(_("tag shorthand without <tag>"));
114 refspec_appendf(&rs
, ":refs/tags/%s", ref
);
116 refspec_appendf(&rs
, "refs/tags/%s", ref
);
117 } else if (deleterefs
) {
118 if (strchr(ref
, ':') || !*ref
)
119 die(_("--delete only accepts plain target ref names"));
120 refspec_appendf(&rs
, ":%s", ref
);
121 } else if (!strchr(ref
, ':')) {
123 /* lazily grab remote and local_refs */
124 remote
= remote_get(repo
);
125 local_refs
= get_local_heads();
127 refspec_append_mapped(&rs
, ref
, remote
, local_refs
);
129 refspec_append(&rs
, ref
);
133 static int push_url_of_remote(struct remote
*remote
, const char ***url_p
)
135 if (remote
->pushurl_nr
) {
136 *url_p
= remote
->pushurl
;
137 return remote
->pushurl_nr
;
139 *url_p
= remote
->url
;
140 return remote
->url_nr
;
143 static NORETURN
void die_push_simple(struct branch
*branch
,
144 struct remote
*remote
)
147 * There's no point in using shorten_unambiguous_ref here,
148 * as the ambiguity would be on the remote side, not what
149 * we have locally. Plus, this is supposed to be the simple
150 * mode. If the user is doing something crazy like setting
151 * upstream to a non-branch, we should probably be showing
152 * them the big ugly fully qualified ref.
154 const char *advice_maybe
= "";
155 const char *short_upstream
= branch
->merge
[0]->src
;
157 skip_prefix(short_upstream
, "refs/heads/", &short_upstream
);
160 * Don't show advice for people who explicitly set
163 if (push_default
== PUSH_DEFAULT_UNSPECIFIED
)
164 advice_maybe
= _("\n"
165 "To choose either option permanently, "
166 "see push.default in 'git help config'.");
167 die(_("The upstream branch of your current branch does not match\n"
168 "the name of your current branch. To push to the upstream branch\n"
169 "on the remote, use\n"
171 " git push %s HEAD:%s\n"
173 "To push to the branch of the same name on the remote, use\n"
175 " git push %s HEAD\n"
177 remote
->name
, short_upstream
,
178 remote
->name
, advice_maybe
);
181 static const char message_detached_head_die
[] =
182 N_("You are not currently on a branch.\n"
183 "To push the history leading to the current (detached HEAD)\n"
186 " git push %s HEAD:<name-of-remote-branch>\n");
188 static const char *get_upstream_ref(struct branch
*branch
, const char *remote_name
)
190 if (!branch
->merge_nr
|| !branch
->merge
|| !branch
->remote_name
)
191 die(_("The current branch %s has no upstream branch.\n"
192 "To push the current branch and set the remote as upstream, use\n"
194 " git push --set-upstream %s %s\n"),
198 if (branch
->merge_nr
!= 1)
199 die(_("The current branch %s has multiple upstream branches, "
200 "refusing to push."), branch
->name
);
202 return branch
->merge
[0]->src
;
205 static void setup_default_push_refspecs(struct remote
*remote
)
207 struct branch
*branch
;
211 switch (push_default
) {
212 case PUSH_DEFAULT_MATCHING
:
213 refspec_append(&rs
, ":");
216 case PUSH_DEFAULT_NOTHING
:
217 die(_("You didn't specify any refspecs to push, and "
218 "push.default is \"nothing\"."));
224 branch
= branch_get(NULL
);
226 die(_(message_detached_head_die
), remote
->name
);
228 dst
= branch
->refname
;
229 same_remote
= !strcmp(remote
->name
, remote_for_branch(branch
, NULL
));
231 switch (push_default
) {
233 case PUSH_DEFAULT_UNSPECIFIED
:
234 case PUSH_DEFAULT_SIMPLE
:
237 if (strcmp(branch
->refname
, get_upstream_ref(branch
, remote
->name
)))
238 die_push_simple(branch
, remote
);
241 case PUSH_DEFAULT_UPSTREAM
:
243 die(_("You are pushing to remote '%s', which is not the upstream of\n"
244 "your current branch '%s', without telling me what to push\n"
245 "to update which remote branch."),
246 remote
->name
, branch
->name
);
247 dst
= get_upstream_ref(branch
, remote
->name
);
250 case PUSH_DEFAULT_CURRENT
:
254 refspec_appendf(&rs
, "%s:%s", branch
->refname
, dst
);
257 static const char message_advice_pull_before_push
[] =
258 N_("Updates were rejected because the tip of your current branch is behind\n"
259 "its remote counterpart. Integrate the remote changes (e.g.\n"
260 "'git pull ...') before pushing again.\n"
261 "See the 'Note about fast-forwards' in 'git push --help' for details.");
263 static const char message_advice_checkout_pull_push
[] =
264 N_("Updates were rejected because a pushed branch tip is behind its remote\n"
265 "counterpart. Check out this branch and integrate the remote changes\n"
266 "(e.g. 'git pull ...') before pushing again.\n"
267 "See the 'Note about fast-forwards' in 'git push --help' for details.");
269 static const char message_advice_ref_fetch_first
[] =
270 N_("Updates were rejected because the remote contains work that you do\n"
271 "not have locally. This is usually caused by another repository pushing\n"
272 "to the same ref. You may want to first integrate the remote changes\n"
273 "(e.g., 'git pull ...') before pushing again.\n"
274 "See the 'Note about fast-forwards' in 'git push --help' for details.");
276 static const char message_advice_ref_already_exists
[] =
277 N_("Updates were rejected because the tag already exists in the remote.");
279 static const char message_advice_ref_needs_force
[] =
280 N_("You cannot update a remote ref that points at a non-commit object,\n"
281 "or update a remote ref to make it point at a non-commit object,\n"
282 "without using the '--force' option.\n");
284 static const char message_advice_ref_needs_update
[] =
285 N_("Updates were rejected because the tip of the remote-tracking\n"
286 "branch has been updated since the last checkout. You may want\n"
287 "to integrate those changes locally (e.g., 'git pull ...')\n"
288 "before forcing an update.\n");
290 static void advise_pull_before_push(void)
292 if (!advice_enabled(ADVICE_PUSH_NON_FF_CURRENT
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
294 advise(_(message_advice_pull_before_push
));
297 static void advise_checkout_pull_push(void)
299 if (!advice_enabled(ADVICE_PUSH_NON_FF_MATCHING
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
301 advise(_(message_advice_checkout_pull_push
));
304 static void advise_ref_already_exists(void)
306 if (!advice_enabled(ADVICE_PUSH_ALREADY_EXISTS
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
308 advise(_(message_advice_ref_already_exists
));
311 static void advise_ref_fetch_first(void)
313 if (!advice_enabled(ADVICE_PUSH_FETCH_FIRST
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
315 advise(_(message_advice_ref_fetch_first
));
318 static void advise_ref_needs_force(void)
320 if (!advice_enabled(ADVICE_PUSH_NEEDS_FORCE
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
322 advise(_(message_advice_ref_needs_force
));
325 static void advise_ref_needs_update(void)
327 if (!advice_enabled(ADVICE_PUSH_REF_NEEDS_UPDATE
) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED
))
329 advise(_(message_advice_ref_needs_update
));
332 static int push_with_options(struct transport
*transport
, struct refspec
*rs
,
336 unsigned int reject_reasons
;
337 char *anon_url
= transport_anonymize_url(transport
->url
);
339 transport_set_verbosity(transport
, verbosity
, progress
);
340 transport
->family
= family
;
343 transport_set_option(transport
,
344 TRANS_OPT_RECEIVEPACK
, receivepack
);
345 transport_set_option(transport
, TRANS_OPT_THIN
, thin
? "yes" : NULL
);
347 if (!is_empty_cas(&cas
)) {
348 if (!transport
->smart_options
)
349 die("underlying transport does not support --%s option",
351 transport
->smart_options
->cas
= &cas
;
355 fprintf(stderr
, _("Pushing to %s\n"), anon_url
);
356 trace2_region_enter("push", "transport_push", the_repository
);
357 err
= transport_push(the_repository
, transport
,
358 rs
, flags
, &reject_reasons
);
359 trace2_region_leave("push", "transport_push", the_repository
);
361 fprintf(stderr
, "%s", push_get_color(PUSH_COLOR_ERROR
));
362 error(_("failed to push some refs to '%s'"), anon_url
);
363 fprintf(stderr
, "%s", push_get_color(PUSH_COLOR_RESET
));
366 err
|= transport_disconnect(transport
);
371 if (reject_reasons
& REJECT_NON_FF_HEAD
) {
372 advise_pull_before_push();
373 } else if (reject_reasons
& REJECT_NON_FF_OTHER
) {
374 advise_checkout_pull_push();
375 } else if (reject_reasons
& REJECT_ALREADY_EXISTS
) {
376 advise_ref_already_exists();
377 } else if (reject_reasons
& REJECT_FETCH_FIRST
) {
378 advise_ref_fetch_first();
379 } else if (reject_reasons
& REJECT_NEEDS_FORCE
) {
380 advise_ref_needs_force();
381 } else if (reject_reasons
& REJECT_REF_NEEDS_UPDATE
) {
382 advise_ref_needs_update();
388 static int do_push(int flags
,
389 const struct string_list
*push_options
,
390 struct remote
*remote
)
395 struct refspec
*push_refspec
= &rs
;
397 if (push_options
->nr
)
398 flags
|= TRANSPORT_PUSH_OPTIONS
;
400 if (!push_refspec
->nr
&& !(flags
& TRANSPORT_PUSH_ALL
)) {
401 if (remote
->push
.nr
) {
402 push_refspec
= &remote
->push
;
403 } else if (!(flags
& TRANSPORT_PUSH_MIRROR
))
404 setup_default_push_refspecs(remote
);
407 url_nr
= push_url_of_remote(remote
, &url
);
409 for (i
= 0; i
< url_nr
; i
++) {
410 struct transport
*transport
=
411 transport_get(remote
, url
[i
]);
412 if (flags
& TRANSPORT_PUSH_OPTIONS
)
413 transport
->push_options
= push_options
;
414 if (push_with_options(transport
, push_refspec
, flags
))
418 struct transport
*transport
=
419 transport_get(remote
, NULL
);
420 if (flags
& TRANSPORT_PUSH_OPTIONS
)
421 transport
->push_options
= push_options
;
422 if (push_with_options(transport
, push_refspec
, flags
))
428 static int option_parse_recurse_submodules(const struct option
*opt
,
429 const char *arg
, int unset
)
431 int *recurse_submodules
= opt
->value
;
434 *recurse_submodules
= RECURSE_SUBMODULES_OFF
;
436 *recurse_submodules
= parse_push_recurse_submodules_arg(opt
->long_name
, arg
);
441 static void set_push_cert_flags(int *flags
, int v
)
444 case SEND_PACK_PUSH_CERT_NEVER
:
445 *flags
&= ~(TRANSPORT_PUSH_CERT_ALWAYS
| TRANSPORT_PUSH_CERT_IF_ASKED
);
447 case SEND_PACK_PUSH_CERT_ALWAYS
:
448 *flags
|= TRANSPORT_PUSH_CERT_ALWAYS
;
449 *flags
&= ~TRANSPORT_PUSH_CERT_IF_ASKED
;
451 case SEND_PACK_PUSH_CERT_IF_ASKED
:
452 *flags
|= TRANSPORT_PUSH_CERT_IF_ASKED
;
453 *flags
&= ~TRANSPORT_PUSH_CERT_ALWAYS
;
459 static int git_push_config(const char *k
, const char *v
, void *cb
)
461 const char *slot_name
;
465 status
= git_gpg_config(k
, v
, NULL
);
469 if (!strcmp(k
, "push.followtags")) {
470 if (git_config_bool(k
, v
))
471 *flags
|= TRANSPORT_PUSH_FOLLOW_TAGS
;
473 *flags
&= ~TRANSPORT_PUSH_FOLLOW_TAGS
;
475 } else if (!strcmp(k
, "push.gpgsign")) {
477 if (!git_config_get_value("push.gpgsign", &value
)) {
478 switch (git_parse_maybe_bool(value
)) {
480 set_push_cert_flags(flags
, SEND_PACK_PUSH_CERT_NEVER
);
483 set_push_cert_flags(flags
, SEND_PACK_PUSH_CERT_ALWAYS
);
486 if (value
&& !strcasecmp(value
, "if-asked"))
487 set_push_cert_flags(flags
, SEND_PACK_PUSH_CERT_IF_ASKED
);
489 return error("Invalid value for '%s'", k
);
492 } else if (!strcmp(k
, "push.recursesubmodules")) {
494 if (!git_config_get_value("push.recursesubmodules", &value
))
495 recurse_submodules
= parse_push_recurse_submodules_arg(k
, value
);
496 } else if (!strcmp(k
, "submodule.recurse")) {
497 int val
= git_config_bool(k
, v
) ?
498 RECURSE_SUBMODULES_ON_DEMAND
: RECURSE_SUBMODULES_OFF
;
499 recurse_submodules
= val
;
500 } else if (!strcmp(k
, "push.pushoption")) {
502 return config_error_nonbool(k
);
505 string_list_clear(&push_options_config
, 0);
507 string_list_append(&push_options_config
, v
);
509 } else if (!strcmp(k
, "color.push")) {
510 push_use_color
= git_config_colorbool(k
, v
);
512 } else if (skip_prefix(k
, "color.push.", &slot_name
)) {
513 int slot
= parse_push_color_slot(slot_name
);
517 return config_error_nonbool(k
);
518 return color_parse(v
, push_colors
[slot
]);
519 } else if (!strcmp(k
, "push.useforceifincludes")) {
520 if (git_config_bool(k
, v
))
521 *flags
|= TRANSPORT_PUSH_FORCE_IF_INCLUDES
;
523 *flags
&= ~TRANSPORT_PUSH_FORCE_IF_INCLUDES
;
527 return git_default_config(k
, v
, NULL
);
530 int cmd_push(int argc
, const char **argv
, const char *prefix
)
536 const char *repo
= NULL
; /* default repository */
537 struct string_list push_options_cmdline
= STRING_LIST_INIT_DUP
;
538 struct string_list
*push_options
;
539 const struct string_list_item
*item
;
540 struct remote
*remote
;
542 struct option options
[] = {
543 OPT__VERBOSITY(&verbosity
),
544 OPT_STRING( 0 , "repo", &repo
, N_("repository"), N_("repository")),
545 OPT_BIT( 0 , "all", &flags
, N_("push all refs"), TRANSPORT_PUSH_ALL
),
546 OPT_BIT( 0 , "mirror", &flags
, N_("mirror all refs"),
547 (TRANSPORT_PUSH_MIRROR
|TRANSPORT_PUSH_FORCE
)),
548 OPT_BOOL('d', "delete", &deleterefs
, N_("delete refs")),
549 OPT_BOOL( 0 , "tags", &tags
, N_("push tags (can't be used with --all or --mirror)")),
550 OPT_BIT('n' , "dry-run", &flags
, N_("dry run"), TRANSPORT_PUSH_DRY_RUN
),
551 OPT_BIT( 0, "porcelain", &flags
, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN
),
552 OPT_BIT('f', "force", &flags
, N_("force updates"), TRANSPORT_PUSH_FORCE
),
553 OPT_CALLBACK_F(0, CAS_OPT_NAME
, &cas
, N_("<refname>:<expect>"),
554 N_("require old value of ref to be at this value"),
555 PARSE_OPT_OPTARG
| PARSE_OPT_LITERAL_ARGHELP
, parseopt_push_cas_option
),
556 OPT_BIT(0, TRANS_OPT_FORCE_IF_INCLUDES
, &flags
,
557 N_("require remote updates to be integrated locally"),
558 TRANSPORT_PUSH_FORCE_IF_INCLUDES
),
559 OPT_CALLBACK(0, "recurse-submodules", &recurse_submodules
, "(check|on-demand|no)",
560 N_("control recursive pushing of submodules"), option_parse_recurse_submodules
),
561 OPT_BOOL_F( 0 , "thin", &thin
, N_("use thin pack"), PARSE_OPT_NOCOMPLETE
),
562 OPT_STRING( 0 , "receive-pack", &receivepack
, "receive-pack", N_("receive pack program")),
563 OPT_STRING( 0 , "exec", &receivepack
, "receive-pack", N_("receive pack program")),
564 OPT_BIT('u', "set-upstream", &flags
, N_("set upstream for git pull/status"),
565 TRANSPORT_PUSH_SET_UPSTREAM
),
566 OPT_BOOL(0, "progress", &progress
, N_("force progress reporting")),
567 OPT_BIT(0, "prune", &flags
, N_("prune locally removed refs"),
568 TRANSPORT_PUSH_PRUNE
),
569 OPT_BIT(0, "no-verify", &flags
, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK
),
570 OPT_BIT(0, "follow-tags", &flags
, N_("push missing but relevant tags"),
571 TRANSPORT_PUSH_FOLLOW_TAGS
),
572 OPT_CALLBACK_F(0, "signed", &push_cert
, "(yes|no|if-asked)", N_("GPG sign the push"),
573 PARSE_OPT_OPTARG
, option_parse_push_signed
),
574 OPT_BIT(0, "atomic", &flags
, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC
),
575 OPT_STRING_LIST('o', "push-option", &push_options_cmdline
, N_("server-specific"), N_("option to transmit")),
576 OPT_SET_INT('4', "ipv4", &family
, N_("use IPv4 addresses only"),
577 TRANSPORT_FAMILY_IPV4
),
578 OPT_SET_INT('6', "ipv6", &family
, N_("use IPv6 addresses only"),
579 TRANSPORT_FAMILY_IPV6
),
583 packet_trace_identity("push");
584 git_config(git_push_config
, &flags
);
585 argc
= parse_options(argc
, argv
, prefix
, options
, push_usage
, 0);
586 push_options
= (push_options_cmdline
.nr
587 ? &push_options_cmdline
588 : &push_options_config
);
589 set_push_cert_flags(&flags
, push_cert
);
591 if (deleterefs
&& (tags
|| (flags
& (TRANSPORT_PUSH_ALL
| TRANSPORT_PUSH_MIRROR
))))
592 die(_("options '%s' and '%s' cannot be used together"), "--delete", "--all/--mirror/--tags");
593 if (deleterefs
&& argc
< 2)
594 die(_("--delete doesn't make sense without any refs"));
596 if (recurse_submodules
== RECURSE_SUBMODULES_CHECK
)
597 flags
|= TRANSPORT_RECURSE_SUBMODULES_CHECK
;
598 else if (recurse_submodules
== RECURSE_SUBMODULES_ON_DEMAND
)
599 flags
|= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND
;
600 else if (recurse_submodules
== RECURSE_SUBMODULES_ONLY
)
601 flags
|= TRANSPORT_RECURSE_SUBMODULES_ONLY
;
604 refspec_append(&rs
, "refs/tags/*");
608 set_refspecs(argv
+ 1, argc
- 1, repo
);
611 remote
= pushremote_get(repo
);
614 die(_("bad repository '%s'"), repo
);
615 die(_("No configured push destination.\n"
616 "Either specify the URL from the command-line or configure a remote repository using\n"
618 " git remote add <name> <url>\n"
620 "and then push using the remote name\n"
622 " git push <name>\n"));
626 flags
|= (TRANSPORT_PUSH_MIRROR
|TRANSPORT_PUSH_FORCE
);
628 if (flags
& TRANSPORT_PUSH_ALL
) {
630 die(_("options '%s' and '%s' cannot be used together"), "--all", "--tags");
632 die(_("--all can't be combined with refspecs"));
634 if (flags
& TRANSPORT_PUSH_MIRROR
) {
636 die(_("options '%s' and '%s' cannot be used together"), "--mirror", "--tags");
638 die(_("--mirror can't be combined with refspecs"));
640 if ((flags
& TRANSPORT_PUSH_ALL
) && (flags
& TRANSPORT_PUSH_MIRROR
))
641 die(_("options '%s' and '%s' cannot be used together"), "--all", "--mirror");
643 if (!is_empty_cas(&cas
) && (flags
& TRANSPORT_PUSH_FORCE_IF_INCLUDES
))
644 cas
.use_force_if_includes
= 1;
646 for_each_string_list_item(item
, push_options
)
647 if (strchr(item
->string
, '\n'))
648 die(_("push options must not have new line characters"));
650 rc
= do_push(flags
, push_options
, remote
);
651 string_list_clear(&push_options_cmdline
, 0);
652 string_list_clear(&push_options_config
, 0);
654 usage_with_options(push_usage
, options
);