最近我一直在使用git stash多次,我一直认为它真的很慢,即使在一个带有单个文件的新存储库中也是如此。我已经阅读了this question关于git stash slowness和this other one并尝试了这些问题的每个答案,但实际上没有任何效果。
例如,我已完成以下步骤来重现它:
git init
touch file.txt
vim file.txt
(编辑添加2行的文件)git add .
git commit -m "Initial commit"
vim file.txt
(再次编辑添加1行)time git stash
输出:
$ 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
。还是很慢......
答案 0 :(得分:3)
一年后,安装git 2.19我已经在git安装过程中看到一个复选框,以启用新的 experimental 内置存储。
就我而言,它运行良好,并且我注意到与旧的实现(使用脚本)相比,巨大的性能有所提高,并且实际上与在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 C的commit 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
的命令,例如checkout
和unpack-trees
。此修补程序使
oneway_merge
通过fsmonitor
检查文件是否被视为未更改,并跳过文件上的ie_match_stat
。
现在,解压缩树还可以从源索引正确复制fsmonitor
的有效性状态。
最后,为了正确起见,我们在fsmonitor
中强制刷新tweak_fsmonitor
状态。此更改后,在Mac上的250k文件存储库中,像
stash
之类的命令(内部使用git reset --hard
)从8s或更长时间变为〜2s 。