Git虚拟文件系统GVFS

原文见:https://blogs.msdn.microsoft.com/visualstudioalm/2017/02/03/announcing-gvfs-git-virtual-file-system/?from=timeline&isappinstalled=0

在微软有着很多不同规模的团队,大部分团队都正在或者准备使用Git。在大多数情况下,Git客户端和在团队服务中的Git repo能够使他们工作的更好。然而,我们仍有少数团队存在着大小异常的代码repo。比如,Windows代码库有着超过超过350万个文件,占用了超过270GB的空间。Git客户端并不是为了如此多的文件或内容所设计的。你可以看到当你运行“git checkout”时,它会花费3个小时执行这个操作,甚至执行一个简单的“git status”操作都需要花费10分钟。假设我们能够执行“git clone”操作,这将花费超过12个小时。


即使是这样也不能阻止我们,我们都是Git的粉丝。这样是为什么我们一直在努力尝试让Git客户端能够支持任何规模的repo。现在,我们来介绍GVFS(Git Virtual File System Git虚拟文件系统)。GVFS将repo下面的文件系统虚拟化,使他看起来像是存储在repo里面的所有文件,但是只有当某个文件第一次被打开的时候才会被下载。GVFS也动态的管理类似于checkout和status等操作中真正有效的数量,因为任何未被合并的文件都可以被安全地忽略。由于我们在文件系统的任何层级都做了这样的操作,因此你的开发工具或者构建工具并不用进行任何的改动!


在一个如此巨大的repo中,开发者不会构件整个源文件。取而代之的是,他们通常会下载最近一次的离线构件输出的文件,并且只构件与他们所修改的地方相关的一小部分。因此,即使在repo中存在着超过300万个文件,一个典型的开发者只需要下载它们需要使用的大约5-10万个文件。


使用GVFS,这意味着他们现在有一个更易于管理的Git体验:clone只需要花费几分钟而不是超过12小时,checkout只需要花费30秒而不是2-3小时,status只需要4-5秒而不是10分钟。同时我们也正在努力让他们变的更好。(当然,权衡是他们的第一次构建需要更长的时间,因为它必须下载它正在构建的每个文件,但后续构建不回比正常情况慢)


虽然GVFS的开发仍在进行中,我们很激动的宣布我们开源了客户端的代码并且将代码放在了https://github.com/Microsoft/gvfs上面。请随意尝试,但请注意,它仍然依赖于一个预发布文件系统驱动程序。驱动程序二进制文件也可以作为NuGet软件包预览,最好的办法是先在虚拟机中使用GVFS,而不是直接在任何生产环境中使用。


除了GVFS源之外,我们还对Git进行了一些更改,以便在GVFS支持的repo上正常工作,这些源位于https://github.com/Microsoft/git。 最后,GVFS依赖于任何服务可以实现的协议扩展; 该协议位于https://github.com/Microsoft/gvfs/blob/master/Protocol.md


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是RISC-V汇编代码实现冒泡排序的函数bubble_sort: ``` .section .text .globl bubble_sort bubble_sort: addi sp, sp, -16 # 为函数保存栈空间 sw ra, 0(sp) # 保存ra寄存器到栈中 sw s0, 4(sp) # 保存s0寄存器到栈中 sw s1, 8(sp) # 保存s1寄存器到栈中 mv s0, a0 # 将第一个参数arr保存到s0寄存器中 mv s1, a1 # 将第二个参数len保存到s1寄存器中 li t0, 1 # 初始化标志变量flag为1 li t1, 0 # 初始化i为0 outer_loop: beqz t0, done # 如果本轮没有发生交换,说明已经排好序,跳到结束 li t0, 0 # 将标志变量flag初始化为0 li t2, 0 # 初始化j为0 inner_loop: bge t1, s1, outer_loop # 如果i >= len,退出内循环 lw t3, 0(s0) # 将arr[i]保存到t3寄存器中 addi t4, s0, 8 # 将arr[j+1]的地址保存到t4寄存器中 bge t2, s1, break_loop # 如果j >= len-1,退出内循环 lw t5, 0(t4) # 将arr[j+1]保存到t5寄存器中 blt t3, t5, no_swap # 如果arr[i] < arr[j+1],不进行交换 sw t5, 0(s0) # 将arr[j+1]保存到arr[i]中 sw t3, 0(t4) # 将arr[i]保存到arr[j+1]中 li t0, 1 # 标志变量flag设置为1,表示本轮发生了交换 no_swap: addi t2, t2, 1 # j++ addi s0, s0, 8 # arr++ j inner_loop break_loop: addi t1, t1, 1 # i++ li t2, 0 # 将j重置为0 mv s0, a0 # 将arr重新指向数组头部 j outer_loop done: lw ra, 0(sp) # 从栈中恢复ra寄存器 lw s0, 4(sp) # 从栈中恢复s0寄存器 lw s1, 8(sp) # 从栈中恢复s1寄存器 addi sp, sp, 16 # 恢复栈指针 ret # 返回 ``` 该函数使用了两层循环,外层循环控制排序的轮数,内层循环控制每轮中的比较和交换。由于传入的数组是以指针形式传递的,所以在实现中需要使用lw和sw指令来读取和写入数组元素的值。为了提高效率,我们使用寄存器来保存一些变量,如标志变量flag、循环变量i、j和数组指针arr。同时,为了保存寄存器的值,在函数的开头使用了addi指令将栈指针sp向下移动,然后将需要保存的寄存器的值保存到栈中,在函数结尾处再将这些值恢复回来,最后使用ret指令返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值