On Tue, Apr 24, 2018 at 5:52 PM, Junio C Hamano <gits...@pobox.com> wrote: > Wink Saville <w...@saville.com> writes: > >> Ideally I would have liked the tags fetched from gbenchmark to have a prefix >> of gbenchmark/, like the branches have, maybe something like: >> >> $ git fetch --tags gbenchmark >> ... >> * [new branch] v2 -> gbenchmark/v2 >> * [new tag] v0.0.9 -> gbenchmark/v0.0.9 >> * [new tag] v0.1.0 -> gbenchmark/v0.1.0 >> * [new tag] v1.0.0 -> gbenchmark/v1.0.0 >> * [new tag] v1.1.0 -> gbenchmark/v1.1.0 >> * [new tag] v1.2.0 -> gbenchmark/v1.2.0 >> * [new tag] v1.3.0 -> gbenchmark/v1.3.0 >> * [new tag] v1.4.0 -> gbenchmark/v1.4.0 > > The tag namespace (refs/tags/) is considered a shared resource (I am > not saying that that is the only valid world model---I am merely > explaining why things are like they are), hence the auto-following > tags will bring them to refs/tags/ (and I do not think there is no > way to configure auto-following to place them elsewhere). > > But you could configure things yourself. > > $ git init victim && cd victim > $ git remote add origin ../git.git > $ git config --add remote.origin.fetch \ > "+refs/tags/*:refs/remote-tags/origin/*" > $ tail -n 4 .git/config > [remote "origin"] > url = ../git.git/ > fetch = +refs/heads/*:refs/remotes/origin/* > fetch = +refs/tags/*:refs/remote-tags/origin/* > $ git fetch --no-tags > > The "--no-tags" option serves to decline the auto-following tags to > refs/tags/ hierarchy; once your repository is configured this way, > your initial and subsequent "git fetch" will copy refs it finds in > refs/tags/ hierarchy over there to your refs/remote-tags/origin/ > hierarchy locally.
Interesting that kinda works, what about teaching git-remote to understand a "--prefix-tags" option which would create the "fetch = refs/tags/*:refs/remote-tags/origin" entry. And teach git-fetch to use that entry if it exists and not require the "--no-tags"? Of course I'm sure there are "lots" of other things to change, doing a search for "remotes/" gives the following: $ find . -type f -name '*.c' | xargs grep '\bremotes/' | sort -uk1,1 ./builtin/branch.c: fmt = "refs/remotes/%s"; ./builtin/checkout.c: skip_prefix(argv0, "remotes/", &argv0); ./builtin/clone.c: strbuf_addf(&branch_top, "refs/remotes/%s/", option_origin); ./builtin/describe.c: !skip_prefix(path, "refs/remotes/", &path_to_match)) { ./builtin/fast-export.c: "refs/remotes/", ./builtin/fetch.c: else if (starts_with(rm->name, "refs/remotes/")) { ./builtin/merge.c: if (starts_with(found_ref, "refs/remotes/")) { ./builtin/pull.c: * refs/heads/<branch_name> to refs/remotes/<remote_name>/<branch_name>. ./builtin/remote.c: strbuf_addf(tmp, "refs/heads/%s:refs/remotes/%s/%s", ./builtin/rev-parse.c: handle_ref_opt(arg, "refs/remotes/"); ./builtin/show-branch.c: if (!starts_with(refname, "refs/remotes/")) ./contrib/examples/builtin-fetch--tool.c: else if (!strncmp(remote_name, "refs/remotes/", 13)) { ./help.c: if (skip_prefix(refname, "refs/remotes/", &remote) && ./log-tree.c: else if (starts_with(refname, "refs/remotes/")) ./ref-filter.c: skip_prefix(refname, "refs/remotes/", &refname) || ./refs.c: return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data); ./remote.c: FILE *f = fopen_or_warn(git_path("remotes/%s", remote->name), "r"); ./revision.c: for_each_glob_ref_in(handle_one_ref, optarg, "refs/remotes/", &cb); ./sha1_name.c: starts_with(refname, "refs/remotes/")) ./wt-status.c: skip_prefix(from, "refs/remotes/", &from); -- wink