git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Shallow clones with explicit history cutoff?

From
Duy Nguyen <pclouds@gmail.com>
Date
Aug 22, 2014, 13:27 UTC
Message-ID
<CACsJy8CSCcaFNxqqBLAnb5NXkwT+wVXCVmB8uF3RYwqRmz4tuw@mail.gmail.com>
In-Reply-To
<loom.20140821T171416-31@post.gmane.org>
On Thu, Aug 21, 2014 at 10:39 PM, Matthias Urlichs <matthias@urlichs.de> wrote:
Show 14 quoted lines
> What I would like to have, instead, is a version of shallow cloning which
> cuts off not at a pre-determined depth, but at a given branch (or set of
> branches). In other words, given
>
>             +-J--K  (packaged)
>            /    /
>   +-F--G--H----I    (clean)
>  /       /
> A---B---C---D---E   (upstream)
>
> a command "git clone --shallow-until upstream $REPO" (or however that would
> be named) would create a shallow git archive which contains branches
> packaged+clean, with commits FGHIJK. In contrast, with --single-branch and
> --depth 4 I would get CGHIJK, which isn't what I'd want.

I would imagine a more generic mechanism "git clone --shallow-rev=<rev> $REPO" where you could pass anything that "git rev-list" can accept (maybe more restricted, and some verification required). --shallow-rev could be repeated. So in your case it could be "git clone --shallow-rev="^A" $REPO". We could even maybe turn --depth into a generic thing that is accepted by rev-list so that it could be easily combined with other rev-list options (--shallow-rev and --depth are mutually exclusive).

> As I have not spent too much time with the git sources lately (as in "None
> at all"), some pointers where to start implementing this would be
> appreciated, assuming (a) this has a reasonable chance of landing in git and
> (b) nobody beats me to it. ;-)

I'd like to see this implemented. You are not the first one complaining about the (lack of) flexibility of --depth. If you have time, I may be able to support (I should not take on another topic given my many ongoing/unfinished topics). The starting point is upload-pack.c. And GIT_TRACE env variable will be your friend. Search for get_shallow_commits(). There the function is supposed to traverse down from want_obj and set/unset SHALLOW/NOT_SHALLOW flags properly.

SHALLOW flag should be set right before the cut-out commit (e.g. B and F if you want to cut A out). NOT_SHALLOW flags could be used to remove shallow lines in the receiver repo. If you traverse past an existing shallow point in the client (this is the fetch/pull case, not clone), then you should set NOT_SHALLOW so the client knows to remove that point from their $GIT_DIR/shallow. Once you set these properly, the rest should work.

-- 
Duy
Previous: Matthias UrlichsNext: Matthias Urlichs
Message 2 of 3 in “Shallow clones with explicit history cutoff?”
  1. Matthias UrlichsAug 21, 2014
  2. Duy NguyenAug 22, 2014
  3. Matthias UrlichsAug 22, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.