• J
    cat-file: disable object/refname ambiguity check for batch mode · 25fba78d
    Jeff King 提交于
    A common use of "cat-file --batch-check" is to feed a list
    of objects from "rev-list --objects" or a similar command.
    In this instance, all of our input objects are 40-byte sha1
    ids. However, cat-file has always allowed arbitrary revision
    specifiers, and feeds the result to get_sha1().
    
    Fortunately, get_sha1() recognizes a 40-byte sha1 before
    doing any hard work trying to look up refs, meaning this
    scenario should end up spending very little time converting
    the input into an object sha1. However, since 798c35fc
    (get_sha1: warn about full or short object names that look
    like refs, 2013-05-29), when we encounter this case, we
    spend the extra effort to do a refname lookup anyway, just
    to print a warning. This is further exacerbated by ca919930
    (get_packed_ref_cache: reload packed-refs file when it
    changes, 2013-06-20), which makes individual ref lookup more
    expensive by requiring a stat() of the packed-refs file for
    each missing ref.
    
    With no patches, this is the time it takes to run:
    
      $ git rev-list --objects --all >objects
      $ time git cat-file --batch-check='%(objectname)' <objects
    
    on the linux.git repository:
    
      real    1m13.494s
      user    0m25.924s
      sys     0m47.532s
    
    If we revert ca919930, the packed-refs up-to-date check, it
    gets a little better:
    
      real    0m54.697s
      user    0m21.692s
      sys     0m32.916s
    
    but we are still spending quite a bit of time on ref lookup
    (and we would not want to revert that patch, anyway, which
    has correctness issues).  If we revert 798c35fc, disabling
    the warning entirely, we get a much more reasonable time:
    
      real    0m7.452s
      user    0m6.836s
      sys     0m0.608s
    
    This patch does the moral equivalent of this final case (and
    gets similar speedups). We introduce a global flag that
    callers of get_sha1() can use to avoid paying the price for
    the warning.
    Signed-off-by: NJeff King <peff@peff.net>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    25fba78d
sha1_name.c 34.2 KB