I am using 'git log' on the windows7 command line and it is very slow.
I tried: Git/Bash is extremely slow in Windows 7 x64
but this did not help. How can i speed things up?
I am using 'git log' on the windows7 command line and it is very slow.
I tried: Git/Bash is extremely slow in Windows 7 x64
but this did not help. How can i speed things up?
Check if the issue persists with the latest Git for Windows Git 2.20.1
And Git 2.21 (Q1 2019) will improve the speed for a particular form of git log
:
git log -G<regex>
looked for a hunk in the "git log -p
" patch output that contained a string that matches the given pattern.
Optimize this code to ignore binary files
, which by default will not show any hunk that would match any pattern (unless textconv
or the --text
option is in effect, that is).
See commit e0e7cb8 (14 Dec 2018) by Thomas Braun (t-b
).
(Merged by Junio C Hamano -- gitster
-- in commit ecdc7cb, 14 Jan 2019)
log -G
: ignore binary filesThe
-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 LibXDiff) 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 LibXDiff:
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 thegit
binary patch format used for preparing patches forgit apply
is different from thexdiff
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 oflog
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.