Skip to content
  • Stefan Beller's avatar
    builtin/describe.c: describe a blob · 644eb60b
    Stefan Beller authored and Junio C Hamano's avatar Junio C Hamano committed
    Sometimes users are given a hash of an object and they want to
    identify it further (ex.: Use verify-pack to find the largest blobs,
    but what are these? or [1])
    
    When describing commits, we try to anchor them to tags or refs, as these
    are conceptually on a higher level than the commit. And if there is no ref
    or tag that matches exactly, we're out of luck.  So we employ a heuristic
    to make up a name for the commit. These names are ambiguous, there might
    be different tags or refs to anchor to, and there might be different
    path in the DAG to travel to arrive at the commit precisely.
    
    When describing a blob, we want to describe the blob from a higher layer
    as well, which is a tuple of (commit, deep/path) as the tree objects
    involved are rather uninteresting.  The same blob can be referenced by
    multiple commits, so how we decide which commit to use?  This patch
    implements a rather naive approach on this: As there are no back pointers
    from blobs to commits in which the blob occurs, we'll start walking from
    any tips available, listing the blobs in-order of the commit and once we
    found the blob, we'll take the first commit that listed the blob. For
    example
    
      git describe --tags v0.99:Makefile
      conversion-901-g7672db20c2:Makefile
    
    tells us the Makefile as it was in v0.99 was introduced in commit 7672db20.
    
    The walking is performed in reverse order to show the introduction of a
    blob rather than its last occurrence.
    
    [1] https://stackoverflow.com/questions/223678/which-commit-has-this-blob
    
    
    
    Signed-off-by: default avatarStefan Beller <sbeller@google.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    644eb60b