为什么' git log'在Windows 7 64上这么慢?

时间:2016-06-02 03:03:49

标签: windows git

我正在使用' git log'在windows7命令行上它很慢。

我试过了:Git/Bash is extremely slow in Windows 7 x64

但这没有帮助。我怎样才能加快速度?

1 个答案:

答案 0 :(得分:0)

检查问题是否仍然存在,最新的Git for Windows Git 2.20.1

Git 2.21(2019年第一季度)将提高特定形式git log的速度:
git log -G<regex>在补丁输出“ git log -p”中寻找一个大块,其中包含与给定模式匹配的字符串。
Optimize this code to ignore binary files,默认情况下不会显示任何匹配任何模式的块(除非textconv--text选项有效)。

请参见commit e0e7cb8Thomas Braun (t-b)(2018年12月14日)。
(由Junio C Hamano -- gitster --commit ecdc7cb中合并,2019年1月14日)

  

log -G:忽略二进制文件

     

日志的-G<regex>选项查找其补丁程序文本包含与正则表达式匹配的已添加/已删除行的差异。

     

当前-G还会查看二进制文件的补丁(根据LibXDiff,它们也是二进制文件。)

     

这有两个问题:

     
      
  • 使镐的搜索速度变慢
      在作者的专有存储库中,仅约5500次提交,.git的总大小约为300MB:
  •   
     

搜索大约需要13秒

$time git log -Gwave > /dev/null
real    0m13,241s
user    0m12,596s
sys     0m0,644s
     

而与此补丁无关的二进制文件大约需要4 s

$time ~/devel/git/git log -Gwave > /dev/null

real    0m3,713s
user    0m3,608s
sys     0m0,105s
     

这是四倍以上的加速速度。

     
      
  • 内部使用的用于生成补丁文本的算法基于   xdiff及其在LibXDiff中的状态:
  •   
     
    

二进制补丁文件的输出格式是专有的     (和二进制),它基本上是复制和插入的集合     命令[..]

  
     

这意味着,由于内部算法不规范,因此一旦更改内部算法,当前格式可能会更改。
  另外,通过比较可以看出,用于为git准备补丁的git apply二进制补丁格式与xdiff格式不同

git log -p -a

commit 6e95bf4bafccf14650d02ab57f3affe669be10cf
 Author: A U Thor <author@example.com>
 Date:   Thu Apr 7 15:14:13 2005 -0700
     

修改二进制文件

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
     

git log --binary

commit 6e95bf4bafccf14650d02ab57f3affe669be10cf
Author: A U Thor <author@example.com>
Date:   Thu Apr 7 15:14:13 2005 -0700
     

修改二进制文件

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
     

这似乎是意外的。

     

为解决这些问题,此补丁默认使-G<regex>忽略二进制文件
  支持Textconv过滤器,还支持-a / --text,以恢复旧的和损坏的行为。

     

-S<block of text>的{​​{1}}选项寻找差异,这些差异改变了文件中指定文本块(即加/删除)的出现次数。当我们想要保持当前行为时,添加一个测试以确保它保持这种状态。