6 #include "run-command.h"
12 #include "transport.h"
13 #include "string-list.h"
14 #include "sha1-array.h"
15 #include "connected.h"
18 static const char receive_pack_usage[] = "git receive-pack <git-dir>";
27 static int deny_deletes;
28 static int deny_non_fast_forwards;
29 static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
30 static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
31 static int receive_fsck_objects = -1;
32 static int transfer_fsck_objects = -1;
33 static int receive_unpack_limit = -1;
34 static int transfer_unpack_limit = -1;
35 static int unpack_limit = 100;
36 static int report_status;
37 static int use_sideband;
39 static int prefer_ofs_delta = 1;
40 static int auto_update_server_info;
41 static int auto_gc = 1;
42 static const char *head_name;
43 static void *head_name_to_free;
44 static int sent_capabilities;
46 static enum deny_action parse_deny_action(const char *var, const char *value)
49 if (!strcasecmp(value, "ignore"))
51 if (!strcasecmp(value, "warn"))
53 if (!strcasecmp(value, "refuse"))
56 if (git_config_bool(var, value))
61 static int receive_pack_config(const char *var, const char *value, void *cb)
63 int status = parse_hide_refs_config(var, value, "receive");
68 if (strcmp(var, "receive.denydeletes") == 0) {
69 deny_deletes = git_config_bool(var, value);
73 if (strcmp(var, "receive.denynonfastforwards") == 0) {
74 deny_non_fast_forwards = git_config_bool(var, value);
78 if (strcmp(var, "receive.unpacklimit") == 0) {
79 receive_unpack_limit = git_config_int(var, value);
83 if (strcmp(var, "transfer.unpacklimit") == 0) {
84 transfer_unpack_limit = git_config_int(var, value);
88 if (strcmp(var, "receive.fsckobjects") == 0) {
89 receive_fsck_objects = git_config_bool(var, value);
93 if (strcmp(var, "transfer.fsckobjects") == 0) {
94 transfer_fsck_objects = git_config_bool(var, value);
98 if (!strcmp(var, "receive.denycurrentbranch")) {
99 deny_current_branch = parse_deny_action(var, value);
103 if (strcmp(var, "receive.denydeletecurrent") == 0) {
104 deny_delete_current = parse_deny_action(var, value);
108 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
109 prefer_ofs_delta = git_config_bool(var, value);
113 if (strcmp(var, "receive.updateserverinfo") == 0) {
114 auto_update_server_info = git_config_bool(var, value);
118 if (strcmp(var, "receive.autogc") == 0) {
119 auto_gc = git_config_bool(var, value);
123 return git_default_config(var, value, cb);
126 static void show_ref(const char *path, const unsigned char *sha1)
128 if (ref_is_hidden(path))
131 if (sent_capabilities)
132 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
134 packet_write(1, "%s %s%c%s%s agent=%s\n",
135 sha1_to_hex(sha1), path, 0,
136 " report-status delete-refs side-band-64k quiet",
137 prefer_ofs_delta ? " ofs-delta" : "",
138 git_user_agent_sanitized());
139 sent_capabilities = 1;
142 static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
144 path = strip_namespace(path);
146 * Advertise refs outside our current namespace as ".have"
147 * refs, so that the client can use them to minimize data
148 * transfer but will otherwise ignore them. This happens to
149 * cover ".have" that are thrown in by add_one_alternate_ref()
150 * to mark histories that are complete in our alternates as
155 show_ref(path, sha1);
159 static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
161 show_ref(".have", sha1);
164 static void collect_one_alternate_ref(const struct ref *ref, void *data)
166 struct sha1_array *sa = data;
167 sha1_array_append(sa, ref->old_sha1);
170 static void write_head_info(void)
172 struct sha1_array sa = SHA1_ARRAY_INIT;
173 for_each_alternate_ref(collect_one_alternate_ref, &sa);
174 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
175 sha1_array_clear(&sa);
176 for_each_ref(show_ref_cb, NULL);
177 if (!sent_capabilities)
178 show_ref("capabilities^{}", null_sha1);
185 struct command *next;
186 const char *error_string;
187 unsigned int skip_update:1,
189 unsigned char old_sha1[20];
190 unsigned char new_sha1[20];
191 char ref_name[FLEX_ARRAY]; /* more */
194 static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
195 static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
197 static void report_message(const char *prefix, const char *err, va_list params)
199 int sz = strlen(prefix);
202 strncpy(msg, prefix, sz);
203 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
204 if (sz > (sizeof(msg) - 1))
205 sz = sizeof(msg) - 1;
209 send_sideband(1, 2, msg, sz, use_sideband);
214 static void rp_warning(const char *err, ...)
217 va_start(params, err);
218 report_message("warning: ", err, params);
222 static void rp_error(const char *err, ...)
225 va_start(params, err);
226 report_message("error: ", err, params);
230 static int copy_to_sideband(int in, int out, void *arg)
234 ssize_t sz = xread(in, data, sizeof(data));
237 send_sideband(1, 2, data, sz, use_sideband);
243 typedef int (*feed_fn)(void *, const char **, size_t *);
244 static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
246 struct child_process proc;
251 argv[0] = find_hook(hook_name);
257 memset(&proc, 0, sizeof(proc));
260 proc.stdout_to_stderr = 1;
263 memset(&muxer, 0, sizeof(muxer));
264 muxer.proc = copy_to_sideband;
266 code = start_async(&muxer);
272 code = start_command(&proc);
275 finish_async(&muxer);
282 if (feed(feed_state, &buf, &n))
284 if (write_in_full(proc.in, buf, n) != n)
289 finish_async(&muxer);
290 return finish_command(&proc);
293 struct receive_hook_feed_state {
299 static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
301 struct receive_hook_feed_state *state = state_;
302 struct command *cmd = state->cmd;
305 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
309 strbuf_reset(&state->buf);
310 strbuf_addf(&state->buf, "%s %s %s\n",
311 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
313 state->cmd = cmd->next;
315 *bufp = state->buf.buf;
316 *sizep = state->buf.len;
321 static int run_receive_hook(struct command *commands, const char *hook_name,
324 struct receive_hook_feed_state state;
327 strbuf_init(&state.buf, 0);
328 state.cmd = commands;
329 state.skip_broken = skip_broken;
330 if (feed_receive_hook(&state, NULL, NULL))
332 state.cmd = commands;
333 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
334 strbuf_release(&state.buf);
338 static int run_update_hook(struct command *cmd)
341 struct child_process proc;
344 argv[0] = find_hook("update");
348 argv[1] = cmd->ref_name;
349 argv[2] = sha1_to_hex(cmd->old_sha1);
350 argv[3] = sha1_to_hex(cmd->new_sha1);
353 memset(&proc, 0, sizeof(proc));
355 proc.stdout_to_stderr = 1;
356 proc.err = use_sideband ? -1 : 0;
359 code = start_command(&proc);
363 copy_to_sideband(proc.err, -1, NULL);
364 return finish_command(&proc);
367 static int is_ref_checked_out(const char *ref)
369 if (is_bare_repository())
374 return !strcmp(head_name, ref);
377 static char *refuse_unconfigured_deny_msg[] = {
378 "By default, updating the current branch in a non-bare repository",
379 "is denied, because it will make the index and work tree inconsistent",
380 "with what you pushed, and will require 'git reset --hard' to match",
381 "the work tree to HEAD.",
383 "You can set 'receive.denyCurrentBranch' configuration variable to",
384 "'ignore' or 'warn' in the remote repository to allow pushing into",
385 "its current branch; however, this is not recommended unless you",
386 "arranged to update its work tree to match what you pushed in some",
389 "To squelch this message and still keep the default behaviour, set",
390 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
393 static void refuse_unconfigured_deny(void)
396 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
397 rp_error("%s", refuse_unconfigured_deny_msg[i]);
400 static char *refuse_unconfigured_deny_delete_current_msg[] = {
401 "By default, deleting the current branch is denied, because the next",
402 "'git clone' won't result in any file checked out, causing confusion.",
404 "You can set 'receive.denyDeleteCurrent' configuration variable to",
405 "'warn' or 'ignore' in the remote repository to allow deleting the",
406 "current branch, with or without a warning message.",
408 "To squelch this message, you can set it to 'refuse'."
411 static void refuse_unconfigured_deny_delete_current(void)
415 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
417 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
420 static const char *update(struct command *cmd)
422 const char *name = cmd->ref_name;
423 struct strbuf namespaced_name_buf = STRBUF_INIT;
424 const char *namespaced_name;
425 unsigned char *old_sha1 = cmd->old_sha1;
426 unsigned char *new_sha1 = cmd->new_sha1;
427 struct ref_lock *lock;
429 /* only refs/... are allowed */
430 if (prefixcmp(name, "refs/") || check_refname_format(name + 5, 0)) {
431 rp_error("refusing to create funny ref '%s' remotely", name);
432 return "funny refname";
435 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
436 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
438 if (is_ref_checked_out(namespaced_name)) {
439 switch (deny_current_branch) {
443 rp_warning("updating the current branch");
446 case DENY_UNCONFIGURED:
447 rp_error("refusing to update checked out branch: %s", name);
448 if (deny_current_branch == DENY_UNCONFIGURED)
449 refuse_unconfigured_deny();
450 return "branch is currently checked out";
454 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
455 error("unpack should have generated %s, "
456 "but I can't find it!", sha1_to_hex(new_sha1));
460 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
461 if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
462 rp_error("denying ref deletion for %s", name);
463 return "deletion prohibited";
466 if (!strcmp(namespaced_name, head_name)) {
467 switch (deny_delete_current) {
471 rp_warning("deleting the current branch");
474 case DENY_UNCONFIGURED:
475 if (deny_delete_current == DENY_UNCONFIGURED)
476 refuse_unconfigured_deny_delete_current();
477 rp_error("refusing to delete the current branch: %s", name);
478 return "deletion of the current branch prohibited";
483 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
484 !is_null_sha1(old_sha1) &&
485 !prefixcmp(name, "refs/heads/")) {
486 struct object *old_object, *new_object;
487 struct commit *old_commit, *new_commit;
489 old_object = parse_object(old_sha1);
490 new_object = parse_object(new_sha1);
492 if (!old_object || !new_object ||
493 old_object->type != OBJ_COMMIT ||
494 new_object->type != OBJ_COMMIT) {
495 error("bad sha1 objects for %s", name);
498 old_commit = (struct commit *)old_object;
499 new_commit = (struct commit *)new_object;
500 if (!in_merge_bases(old_commit, new_commit)) {
501 rp_error("denying non-fast-forward %s"
502 " (you should pull first)", name);
503 return "non-fast-forward";
506 if (run_update_hook(cmd)) {
507 rp_error("hook declined to update %s", name);
508 return "hook declined";
511 if (is_null_sha1(new_sha1)) {
512 if (!parse_object(old_sha1)) {
514 if (ref_exists(name)) {
515 rp_warning("Allowing deletion of corrupt ref.");
517 rp_warning("Deleting a non-existent ref.");
518 cmd->did_not_exist = 1;
521 if (delete_ref(namespaced_name, old_sha1, 0)) {
522 rp_error("failed to delete %s", name);
523 return "failed to delete";
525 return NULL; /* good */
528 lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
530 rp_error("failed to lock %s", name);
531 return "failed to lock";
533 if (write_ref_sha1(lock, new_sha1, "push")) {
534 return "failed to write"; /* error() already called */
536 return NULL; /* good */
540 static void run_update_post_hook(struct command *commands)
545 struct child_process proc;
548 hook = find_hook("post-update");
549 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
550 if (cmd->error_string || cmd->did_not_exist)
557 argv = xmalloc(sizeof(*argv) * (2 + argc));
560 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
562 if (cmd->error_string || cmd->did_not_exist)
564 p = xmalloc(strlen(cmd->ref_name) + 1);
565 strcpy(p, cmd->ref_name);
571 memset(&proc, 0, sizeof(proc));
573 proc.stdout_to_stderr = 1;
574 proc.err = use_sideband ? -1 : 0;
577 if (!start_command(&proc)) {
579 copy_to_sideband(proc.err, -1, NULL);
580 finish_command(&proc);
584 static void check_aliased_update(struct command *cmd, struct string_list *list)
586 struct strbuf buf = STRBUF_INIT;
587 const char *dst_name;
588 struct string_list_item *item;
589 struct command *dst_cmd;
590 unsigned char sha1[20];
591 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
594 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
595 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
596 strbuf_release(&buf);
598 if (!(flag & REF_ISSYMREF))
601 dst_name = strip_namespace(dst_name);
603 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
604 cmd->skip_update = 1;
605 cmd->error_string = "broken symref";
609 if ((item = string_list_lookup(list, dst_name)) == NULL)
612 cmd->skip_update = 1;
614 dst_cmd = (struct command *) item->util;
616 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
617 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
620 dst_cmd->skip_update = 1;
622 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
623 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
624 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
625 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
626 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
627 " its target '%s' (%s..%s)",
628 cmd->ref_name, cmd_oldh, cmd_newh,
629 dst_cmd->ref_name, dst_oldh, dst_newh);
631 cmd->error_string = dst_cmd->error_string =
632 "inconsistent aliased update";
635 static void check_aliased_updates(struct command *commands)
638 struct string_list ref_list = STRING_LIST_INIT_NODUP;
640 for (cmd = commands; cmd; cmd = cmd->next) {
641 struct string_list_item *item =
642 string_list_append(&ref_list, cmd->ref_name);
643 item->util = (void *)cmd;
645 sort_string_list(&ref_list);
647 for (cmd = commands; cmd; cmd = cmd->next) {
648 if (!cmd->error_string)
649 check_aliased_update(cmd, &ref_list);
652 string_list_clear(&ref_list, 0);
655 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
657 struct command **cmd_list = cb_data;
658 struct command *cmd = *cmd_list;
660 if (!cmd || is_null_sha1(cmd->new_sha1))
661 return -1; /* end of list */
662 *cmd_list = NULL; /* this returns only one */
663 hashcpy(sha1, cmd->new_sha1);
667 static void set_connectivity_errors(struct command *commands)
671 for (cmd = commands; cmd; cmd = cmd->next) {
672 struct command *singleton = cmd;
673 if (!check_everything_connected(command_singleton_iterator,
676 cmd->error_string = "missing necessary objects";
680 static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
682 struct command **cmd_list = cb_data;
683 struct command *cmd = *cmd_list;
686 if (!is_null_sha1(cmd->new_sha1)) {
687 hashcpy(sha1, cmd->new_sha1);
688 *cmd_list = cmd->next;
694 return -1; /* end of list */
697 static void reject_updates_to_hidden(struct command *commands)
701 for (cmd = commands; cmd; cmd = cmd->next) {
702 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
704 if (is_null_sha1(cmd->new_sha1))
705 cmd->error_string = "deny deleting a hidden ref";
707 cmd->error_string = "deny updating a hidden ref";
711 static void execute_commands(struct command *commands, const char *unpacker_error)
714 unsigned char sha1[20];
716 if (unpacker_error) {
717 for (cmd = commands; cmd; cmd = cmd->next)
718 cmd->error_string = "unpacker error";
723 if (check_everything_connected(iterate_receive_command_list,
725 set_connectivity_errors(commands);
727 reject_updates_to_hidden(commands);
729 if (run_receive_hook(commands, "pre-receive", 0)) {
730 for (cmd = commands; cmd; cmd = cmd->next) {
731 if (!cmd->error_string)
732 cmd->error_string = "pre-receive hook declined";
737 check_aliased_updates(commands);
739 free(head_name_to_free);
740 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
742 for (cmd = commands; cmd; cmd = cmd->next) {
743 if (cmd->error_string)
746 if (cmd->skip_update)
749 cmd->error_string = update(cmd);
753 static struct command *read_head_info(void)
755 struct command *commands = NULL;
756 struct command **p = &commands;
759 unsigned char old_sha1[20], new_sha1[20];
764 line = packet_read_line(0, &len);
770 get_sha1_hex(line, old_sha1) ||
771 get_sha1_hex(line + 41, new_sha1))
772 die("protocol error: expected old/new/ref, got '%s'",
776 reflen = strlen(refname);
777 if (reflen + 82 < len) {
778 const char *feature_list = refname + reflen + 1;
779 if (parse_feature_request(feature_list, "report-status"))
781 if (parse_feature_request(feature_list, "side-band-64k"))
782 use_sideband = LARGE_PACKET_MAX;
783 if (parse_feature_request(feature_list, "quiet"))
786 cmd = xcalloc(1, sizeof(struct command) + len - 80);
787 hashcpy(cmd->old_sha1, old_sha1);
788 hashcpy(cmd->new_sha1, new_sha1);
789 memcpy(cmd->ref_name, line + 82, len - 81);
796 static const char *parse_pack_header(struct pack_header *hdr)
798 switch (read_pack_header(0, hdr)) {
800 return "eof before pack header was fully read";
802 case PH_ERROR_PACK_SIGNATURE:
803 return "protocol error (pack signature mismatch detected)";
805 case PH_ERROR_PROTOCOL:
806 return "protocol error (pack version unsupported)";
809 return "unknown error in parse_pack_header";
816 static const char *pack_lockfile;
818 static const char *unpack(int err_fd)
820 struct pack_header hdr;
823 int fsck_objects = (receive_fsck_objects >= 0
824 ? receive_fsck_objects
825 : transfer_fsck_objects >= 0
826 ? transfer_fsck_objects
829 hdr_err = parse_pack_header(&hdr);
835 snprintf(hdr_arg, sizeof(hdr_arg),
836 "--pack_header=%"PRIu32",%"PRIu32,
837 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
839 if (ntohl(hdr.hdr_entries) < unpack_limit) {
841 struct child_process child;
842 const char *unpacker[5];
843 unpacker[i++] = "unpack-objects";
845 unpacker[i++] = "-q";
847 unpacker[i++] = "--strict";
848 unpacker[i++] = hdr_arg;
849 unpacker[i++] = NULL;
850 memset(&child, 0, sizeof(child));
851 child.argv = unpacker;
855 code = run_command(&child);
858 return "unpack-objects abnormal exit";
860 const char *keeper[7];
861 int s, status, i = 0;
863 struct child_process ip;
865 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
866 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
867 strcpy(keep_arg + s, "localhost");
869 keeper[i++] = "index-pack";
870 keeper[i++] = "--stdin";
872 keeper[i++] = "--strict";
873 keeper[i++] = "--fix-thin";
874 keeper[i++] = hdr_arg;
875 keeper[i++] = keep_arg;
877 memset(&ip, 0, sizeof(ip));
882 status = start_command(&ip);
884 return "index-pack fork failed";
886 pack_lockfile = index_pack_lockfile(ip.out);
888 status = finish_command(&ip);
890 reprepare_packed_git();
893 return "index-pack abnormal exit";
897 static const char *unpack_with_sideband(void)
905 memset(&muxer, 0, sizeof(muxer));
906 muxer.proc = copy_to_sideband;
908 if (start_async(&muxer))
911 ret = unpack(muxer.in);
913 finish_async(&muxer);
917 static void report(struct command *commands, const char *unpack_status)
920 struct strbuf buf = STRBUF_INIT;
922 packet_buf_write(&buf, "unpack %s\n",
923 unpack_status ? unpack_status : "ok");
924 for (cmd = commands; cmd; cmd = cmd->next) {
925 if (!cmd->error_string)
926 packet_buf_write(&buf, "ok %s\n",
929 packet_buf_write(&buf, "ng %s %s\n",
930 cmd->ref_name, cmd->error_string);
932 packet_buf_flush(&buf);
935 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
937 write_or_die(1, buf.buf, buf.len);
938 strbuf_release(&buf);
941 static int delete_only(struct command *commands)
944 for (cmd = commands; cmd; cmd = cmd->next) {
945 if (!is_null_sha1(cmd->new_sha1))
951 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
953 int advertise_refs = 0;
954 int stateless_rpc = 0;
957 struct command *commands;
959 packet_trace_identity("receive-pack");
962 for (i = 1; i < argc; i++) {
963 const char *arg = *argv++;
966 if (!strcmp(arg, "--quiet")) {
971 if (!strcmp(arg, "--advertise-refs")) {
975 if (!strcmp(arg, "--stateless-rpc")) {
980 usage(receive_pack_usage);
983 usage(receive_pack_usage);
987 usage(receive_pack_usage);
991 if (!enter_repo(dir, 0))
992 die("'%s' does not appear to be a git repository", dir);
994 if (is_repository_shallow())
995 die("attempt to push into a shallow repository");
997 git_config(receive_pack_config, NULL);
999 if (0 <= transfer_unpack_limit)
1000 unpack_limit = transfer_unpack_limit;
1001 else if (0 <= receive_unpack_limit)
1002 unpack_limit = receive_unpack_limit;
1004 if (advertise_refs || !stateless_rpc) {
1010 if ((commands = read_head_info()) != NULL) {
1011 const char *unpack_status = NULL;
1013 if (!delete_only(commands))
1014 unpack_status = unpack_with_sideband();
1015 execute_commands(commands, unpack_status);
1017 unlink_or_warn(pack_lockfile);
1019 report(commands, unpack_status);
1020 run_receive_hook(commands, "post-receive", 1);
1021 run_update_post_hook(commands);
1023 const char *argv_gc_auto[] = {
1024 "gc", "--auto", "--quiet", NULL,
1026 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1027 run_command_v_opt(argv_gc_auto, opt);
1029 if (auto_update_server_info)
1030 update_server_info(0);