与Libgit2

时间:2017-05-24 13:30:01

标签: c# git libgit2 libgit2sharp git-for-windows

最近我一直在使用git stash多次,我一直认为它真的很慢,即使在一个带有单个文件的新存储库中也是如此。我已经阅读了this question关于git stash slowness和this other one并尝试了这些问题的每个答案,但实际上没有任何效果。

例如,我已完成以下步骤来重现它:

  1. git init
  2. touch file.txt
  3. vim file.txt(编辑添加2行的文件)
  4. git add .
  5. git commit -m "Initial commit"
  6. vim file.txt(再次编辑添加1行)
  7. time git stash
  8. 输出:

    $ time git stash
    Saved working directory and index state WIP on master: b9454ed Initial commit
    HEAD is now at b9454ed Initial commit    
    real    0m8.042s
    user    0m0.000s
    sys     0m0.046s
    
    用于存储单行的8秒钟是如此之多。 现在使用libgit2sharp进行测试:

    static void Main(string[] args)
    {
        Repository repo=new Repository(@"C:\Users\UserTest\TestGitRepo");
    
        repo.Stashes.Add(new Signature("test", "test@test.com", new DateTimeOffset(DateTime.Now)), "Stash on master");
    }
    

    此代码需要74毫秒来存储相同的更改。 如果Libgit2那么快,那么应该可以加速git stash命令。我怎样才能做到这一点?

    实际上使用windows 10 64bit和git 2.11 64bits。其他git命令(如status,add,commit等)工作正常。

    更新:我已经更新为git 2.13,现在它为git stash的14,53 ...

    更新2:我已更新为git 2.15并尝试相同的测试time git stash返回real 0m6,553s。还是很慢......

3 个答案:

答案 0 :(得分:3)

一年后,安装git 2.19我已经在git安装过程中看到一个复选框,以启用新的 experimental 内置存储。

Experimental built-in git stash

就我而言,它运行良好,并且我注意到与旧的实现(使用脚本)相比,巨大的性能有所提高,并且实际上与在Linux中使用相同的命令一样快。

这里的结果遵循完全相同的步骤:

$ time git stash
Saved working directory and index state WIP on master: 7a29b92 Initial commit

real    0m0,120s
user    0m0,000s
sys     0m0,015s

一旦它成为git stash的正式和稳定版本,我将进行更新。

答案 1 :(得分:1)

要添加到现有答案中,您可以启用新功能(如果您已经安装了2.19或更高版本):

git config --global stash.usebuiltin true

这也适用于便携式版本。

请注意,此功能似乎还不适用于子模块。 https://github.com/git-for-windows/git/issues/1820

答案 2 :(得分:0)

git stash将在Git 2.25(2020年第一季度)上更快,其中oneway_merge()的用户(如“ reset --hard”)学会了利用fsmonitor来避免不必要的{ {3}}个电话。

(自Git 2.22,2019年第二季度开始,lstat(2),它是默认值)

请参见git stash is entirely rewritten in Ccommit 679f2f9(2019年11月20日)。
(由Utsav Shah (Utsav2)Junio C Hamano -- gitster --中合并,2019年12月5日)

  

commit 473b431:跳过fsmonitor有效文件的统计信息

     

帮助者:Junio C Hamano
  帮助人:凯文·威尔福德
  签名人:Utsav Shah

     

索引可能会知道文件尚未通过fsmonitor进行修改,但是unpack-trees没有注意该文件,而是通过ie_match_stat对其进行了检查,这在某些文件系统上可能效率不高。 />   这会显着降低运行oneway_merge的命令,例如checkoutunpack-trees

     

此修补程序使oneway_merge通过fsmonitor检查文件是否被视为未更改,并跳过文件上的ie_match_stat
  现在,解压缩树还可以从源索引正确复制fsmonitor的有效性状态。
  最后,为了正确起见,我们在fsmonitor中强制刷新tweak_fsmonitor状态。

     

此更改后,在Mac上的250k文件存储库中,像 stash 之类的命令(内部使用git reset --hard从8s或更长时间变为〜2s