2

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?

Community
  • 1
  • 1
bier hier
  • 20,970
  • 42
  • 97
  • 166
  • Have you considered installing cygwin and using the cygwin version of git and/or bash? – Craig Estey Jun 02 '16 at 03:19
  • I installed lambda cmder is that similar, same issue – bier hier Jun 02 '16 at 03:21
  • I've not used lambda cmder, so I can't say. I've looked at the source code for cygwin. IMO, it goes to great lengths to be the environment that is closest to linux (i.e. git's [and bash's] bread and butter) and also does its best to be fast. In any case, I'd say the best way is to try it. For me, when I need git, bash, perl(!), etc. ports, I use cygwin. One of the reasons: cygwin's environment. It allows most pgms to be ported with just a recompile. They don't have to get hacked up with #ifdefs, etc. Thus, cygwin can supply almost any utility [the repo has _many_ packages] – Craig Estey Jun 02 '16 at 03:29

1 Answers1

0

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 files

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 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 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.

VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250