From: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, johannes.schindelin@gmx.de,
Derrick Stolee <stolee@gmail.com>,
Derrick Stolee <stolee@gmail.com>
Subject: [PATCH v2] scalar: add --no-tags option to 'scalar clone'
Date: Fri, 06 Sep 2024 20:21:41 +0000 [thread overview]
Message-ID: <pull.1780.v2.git.1725654102035.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1780.git.1725545614416.gitgitgadget@gmail.com>
From: Derrick Stolee <stolee@gmail.com>
Some large repositories use tags to track a huge list of release
versions. While this choice is costly on the ref advertisement, it is
further wasteful for clients who do not need those tags. Allow clients
to optionally skip the tag advertisement.
This behavior is similar to that of 'git clone --no-tags' implemented in
0dab2468ee5 (clone: add a --no-tags option to clone without tags,
2017-04-26), including the modification of the remote.origin.tagOpt
config value to include "--no-tags".
One thing that is opposite of the 'git clone' implementation is that
this allows '--tags' as an assumed option, which can be naturally negated
with '--no-tags'. The clone command does not accept '--tags' but allows
"--no-no-tags" as the negation of its '--no-tags' option.
While testing this option, combine the test with the previously untested
'--no-src' option introduced in 4527db8ff8c (scalar: add --[no-]src
option, 2023-08-28).
Signed-off-by: Derrick Stolee <stolee@gmail.com>
---
scalar: add --no-tags option
The need for this was discovered due to the release behavior of an
internal monorepo. The use of Azure DevOps' limited refs feature does
not apply to tags, so the number of tags was causing some pain for
users.
Thanks, -Stolee
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1780%2Fderrickstolee%2Fscalar-no-tags-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1780/derrickstolee/scalar-no-tags-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1780
Range-diff vs v1:
1: f0e8217869a ! 1: 3378b4f728a scalar: add --no-tags option
@@ Metadata
Author: Derrick Stolee <dstolee@microsoft.com>
## Commit message ##
- scalar: add --no-tags option
+ scalar: add --no-tags option to 'scalar clone'
Some large repositories use tags to track a huge list of release
- versions. While this is choice is costly on the ref advertisement, it is
+ versions. While this choice is costly on the ref advertisement, it is
further wasteful for clients who do not need those tags. Allow clients
to optionally skip the tag advertisement.
@@ Documentation/scalar.txt: cloning. If the HEAD at the remote did not point at an
+ By default, `scalar clone` will fetch the tag objects advertised by
+ the remote and future `git fetch` commands will do the same. Use
+ `--no-tags` to avoid fetching tags in `scalar clone` and to configure
-+ the repository to avoid fetching tags in the future.
++ the repository to avoid fetching tags in the future. To fetch tags after
++ cloning with `--no-tags`, run `git fetch --tags`.
+
--[no-]full-clone::
A sparse-checkout is initialized by default. This behavior can be
@@ scalar.c: static int cmd_clone(int argc, const char **argv)
show_progress ? "--progress" : "--no-progress",
- "origin", NULL))) {
+ "origin",
-+ (!tags ? "--no-tags" : NULL),
++ (tags ? NULL : "--no-tags"),
+ NULL))) {
warning(_("partial clone failed; attempting full clone"));
Documentation/scalar.txt | 7 +++++++
scalar.c | 15 ++++++++++++---
t/t9210-scalar.sh | 18 ++++++++++++++++++
3 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/Documentation/scalar.txt b/Documentation/scalar.txt
index 361f51a6473..7e4259c6743 100644
--- a/Documentation/scalar.txt
+++ b/Documentation/scalar.txt
@@ -86,6 +86,13 @@ cloning. If the HEAD at the remote did not point at any branch when
`<entlistment>/src` directory. Use `--no-src` to place the cloned
repository directly in the `<enlistment>` directory.
+--[no-]tags::
+ By default, `scalar clone` will fetch the tag objects advertised by
+ the remote and future `git fetch` commands will do the same. Use
+ `--no-tags` to avoid fetching tags in `scalar clone` and to configure
+ the repository to avoid fetching tags in the future. To fetch tags after
+ cloning with `--no-tags`, run `git fetch --tags`.
+
--[no-]full-clone::
A sparse-checkout is initialized by default. This behavior can be
turned off via `--full-clone`.
diff --git a/scalar.c b/scalar.c
index 6166a8dd4c8..09560aeab54 100644
--- a/scalar.c
+++ b/scalar.c
@@ -410,7 +410,7 @@ static int cmd_clone(int argc, const char **argv)
{
const char *branch = NULL;
int full_clone = 0, single_branch = 0, show_progress = isatty(2);
- int src = 1;
+ int src = 1, tags = 1;
struct option clone_options[] = {
OPT_STRING('b', "branch", &branch, N_("<branch>"),
N_("branch to checkout after clone")),
@@ -421,11 +421,13 @@ static int cmd_clone(int argc, const char **argv)
"be checked out")),
OPT_BOOL(0, "src", &src,
N_("create repository within 'src' directory")),
+ OPT_BOOL(0, "tags", &tags,
+ N_("specify if tags should be fetched during clone")),
OPT_END(),
};
const char * const clone_usage[] = {
N_("scalar clone [--single-branch] [--branch <main-branch>] [--full-clone]\n"
- "\t[--[no-]src] <url> [<enlistment>]"),
+ "\t[--[no-]src] [--[no-]tags] <url> [<enlistment>]"),
NULL
};
const char *url;
@@ -504,6 +506,11 @@ static int cmd_clone(int argc, const char **argv)
goto cleanup;
}
+ if (!tags && set_config("remote.origin.tagOpt=--no-tags")) {
+ res = error(_("could not disable tags in '%s'"), dir);
+ goto cleanup;
+ }
+
if (!full_clone &&
(res = run_git("sparse-checkout", "init", "--cone", NULL)))
goto cleanup;
@@ -513,7 +520,9 @@ static int cmd_clone(int argc, const char **argv)
if ((res = run_git("fetch", "--quiet",
show_progress ? "--progress" : "--no-progress",
- "origin", NULL))) {
+ "origin",
+ (tags ? NULL : "--no-tags"),
+ NULL))) {
warning(_("partial clone failed; attempting full clone"));
if (set_config("remote.origin.promisor") ||
diff --git a/t/t9210-scalar.sh b/t/t9210-scalar.sh
index a41b4fcc085..e8613990e13 100755
--- a/t/t9210-scalar.sh
+++ b/t/t9210-scalar.sh
@@ -169,6 +169,24 @@ test_expect_success 'scalar clone' '
)
'
+test_expect_success 'scalar clone --no-... opts' '
+ # Note: redirect stderr always to avoid having a verbose test
+ # run result in a difference in the --[no-]progress option.
+ GIT_TRACE2_EVENT="$(pwd)/no-opt-trace" scalar clone \
+ --no-tags --no-src \
+ "file://$(pwd)" no-opts --single-branch 2>/dev/null &&
+
+ test_subcommand git fetch --quiet --no-progress \
+ origin --no-tags <no-opt-trace &&
+ (
+ cd no-opts &&
+
+ test_cmp_config --no-tags remote.origin.tagopt &&
+ git for-each-ref --format="%(refname)" refs/tags/ >tags &&
+ test_line_count = 0 tags
+ )
+'
+
test_expect_success 'scalar reconfigure' '
git init one/src &&
scalar register one &&
base-commit: 2e7b89e038c0c888acf61f1b4ee5a43d4dd5e94c
--
gitgitgadget
prev parent reply other threads:[~2024-09-06 20:21 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-05 14:13 [PATCH] scalar: add --no-tags option Derrick Stolee via GitGitGadget
2024-09-05 16:12 ` Junio C Hamano
2024-09-05 18:25 ` Junio C Hamano
2024-09-06 7:23 ` Johannes Schindelin
2024-09-06 15:13 ` Junio C Hamano
2024-09-06 19:46 ` Derrick Stolee
2024-09-06 20:21 ` Derrick Stolee via GitGitGadget [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1780.v2.git.1725654102035.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=stolee@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).