From: Eric Sunshine Date: Tue, 12 May 2015 22:01:10 GMT Subject: Re: [PATCH 3/3] upload-pack: Optionally allow fetching reachable sha1 Message-ID: In-Reply-To: <1431465265-18486-3-git-send-email-fredrik.medley@gmail.com> On Tue, May 12, 2015 at 5:14 PM, Fredrik Medley wrote: > With uploadpack.allowReachableSHA1InWant configuration option set on the > server side, "git fetch" can make a request with a "want" line that names > an object that has not been advertised (likely to have been obtained out > of band or from a submodule pointer). Only objects reachable from the > branch tips, i.e. the union of advertised branches and branches hidden by > transfer.hideRefs, will be processed. Note that there is an associated > cost of having to walk back the hstory to check the reachability. Mentioned previously[1]: s/hstory/history/ > This feature can be used when obtaining the content of a certain commit, > for which the sha1 is known, without the need of cloning the whole > repository, especially if a shallow fetch is used. Useful cases are e.g. > repositories containing large files in the history, fetching only the > needed data for a submodule checkout, when sharing a sha1 without telling > which exact branch it belongs to and in Gerrit, if you think in terms of > commits instead of change numbers. (The Gerrit case has already been > solved through allowTipSHA1InWant as every Gerrit change has a ref.) > > Signed-off-by: Fredrik Medley > --- > diff --git a/Documentation/config.txt b/Documentation/config.txt > index 2b86fe6..ffc4cf4 100644 > --- a/Documentation/config.txt > +++ b/Documentation/config.txt > @@ -2538,6 +2538,12 @@ uploadpack.allowTipSHA1InWant:: > of a hidden ref (by default, such a request is rejected). > see also `uploadpack.hideRefs`. > > +uploadpack.allowReachableSHA1InWant:: > + Allow `upload-pack` to accept a fetch request that asks for an > + object that is reachable from any ref tip. However, note that > + calculating object reachability is computationally expensive. Mentioned previously[1]: s/\s+/ / > + Defaults to `false`. > + > diff --git a/fetch-pack.c b/fetch-pack.c > index 77174f9..6c63d8e 100644 > --- a/fetch-pack.c > +++ b/fetch-pack.c > @@ -545,7 +547,7 @@ static void filter_refs(struct fetch_pack_args *args, > } > > /* Append unmatched requests to the list */ > - if (allow_request_with_bare_object_name & ALLOW_TIP) { > + if (allow_request_with_bare_object_name & (ALLOW_TIP | ALLOW_REACHABLE)) { Wrap this in extra parentheses to avoid compilation warnings: if ((foo & (bar | baz))) { > for (i = 0; i < nr_sought; i++) { > unsigned char sha1[20]; > [1]: http://article.gmane.org/gmane.comp.version-control.git/268428