Skip to content
  • Thomas Braun's avatar
    log -G: ignore binary files · e0e7cb80
    Thomas Braun authored and Junio C Hamano's avatar Junio C Hamano committed
    The -G<regex> option of log looks for the differences whose patch text
    contains added/removed lines that match regex.
    
    Currently -G looks also into patches of binary files (which
    according to [1]) is binary as well.
    
    This has a couple of issues:
    
    - It makes the pickaxe search slow. In a proprietary repository of the
      author with only ~5500 commits and a total .git size of ~300MB
      searching takes ~13 seconds
    
        $time git log -Gwave > /dev/null
    
        real    0m13,241s
        user    0m12,596s
        sys     0m0,644s
    
      whereas when we ignore binary files with this patch it takes ~4s
    
        $time ~/devel/git/git log -Gwave > /dev/null
    
        real    0m3,713s
        user    0m3,608s
        sys     0m0,105s
    
      which is a speedup of more than fourfold.
    
    - The internally used algorithm for generating patch text is based on
      xdiff and its states in [1]
    
      > The output format of the binary patch file is proprietary
      > (and binary) and it is basically a collection of copy and insert
      > commands [..]
    
      which means that the current format could change once the internal
      algorithm is changed as the format is not standardized. In addition
      the git binary patch format used for preparing patches for git apply
      is *different* from the xdiff format as can be seen by comparing
    
      git log -p -a
    
        commit 6e95bf4bafccf14650d02ab57f3affe669be10cf
        Author: A U Thor <author@example.com>
        Date:   Thu Apr 7 15:14:13 2005 -0700
    
            modify binary file
    
        diff --git a/data.bin b/data.bin
        index f414c84..edfeb6f 100644
        --- a/data.bin
        +++ b/data.bin
        @@ -1,2 +1,4 @@
         a
         a^@a
        +a
        +a^@a
    
      with git log --binary
    
        commit 6e95bf4bafccf14650d02ab57f3affe669be10cf
        Author: A U Thor <author@example.com>
        Date:   Thu Apr 7 15:14:13 2005 -0700
    
            modify binary file
    
        diff --git a/data.bin b/data.bin
        index f414c84bd3aa25fa07836bb1fb73db784635e24b..edfeb6f501[..]
        GIT binary patch
        literal 12
        QcmYe~N@Pgn0zx1O01)N^ZvX%Q
    
        literal 6
        NcmYe~N@Pgn0ssWg0XP5v
    
      which seems unexpected.
    
    To resolve these issues this patch makes -G<regex> ignore binary files
    by default. Textconv filters are supported and also -a/--text for
    getting the old and broken behaviour back.
    
    The -S<block of text> option of log looks for differences that changes
    the number of occurrences of the specified block of text (i.e.
    addition/deletion) in a file. As we want to keep the current behaviour,
    add a test to ensure it stays that way.
    
    [1]: http://www.xmailserver.org/xdiff.html
    
    
    
    Signed-off-by: default avatarThomas Braun <thomas.braun@virtuell-zuhause.de>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    e0e7cb80