Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git大文件存储背后的存储机制是什么?_Git_Github - Fatal编程技术网

Git大文件存储背后的存储机制是什么?

Git大文件存储背后的存储机制是什么?,git,github,Git,Github,Github最近在git中引入了一种新的方法,用于以不同的方式存储大型文件。扩展名用Git中的文本指针替换大型文件的确切含义是什么?您可以在下面的中看到: 和来源意味着git lfs可以使用来: 签出时下载实际文件 提交时将其存储在外部源中 见: Git LFS的核心思想是,不向Git存储库写入大blob,只写入指针文件 Git LFS需要一个URL端点来与远程服务器通信。 对于不同的远程设备,Git存储库可以有不同的Git LFS端点 实际文件上载到服务器或从服务器下载,该服务器尊重文件

Github最近在git中引入了一种新的方法,用于以不同的方式存储大型文件。扩展名用Git中的文本指针替换大型文件的确切含义是什么?

您可以在下面的中看到:

和来源意味着
git lfs
可以使用来:

  • 签出时下载实际文件
  • 提交时将其存储在外部源中
见:

Git LFS的核心思想是,不向Git存储库写入大blob,只写入指针文件

Git LFS需要一个URL端点来与远程服务器通信。
对于不同的远程设备,Git存储库可以有不同的Git LFS端点

实际文件上载到服务器或从服务器下载,该服务器尊重文件

这一点得到了《公约》的确认,其中提到:

实际文件被推送到

为了支持上传和下载二进制内容,您需要一个实现该API的Git服务器


关于内容过滤器驱动程序(它在Git中存在很长一段时间,早在lfs之前,lfs在这里就使用它来添加这个“大文件管理”特性),这就是大部分工作发生的地方:

当文件从Git存储库签出到工作目录时,涂抹过滤器运行。
Git将Git blob的内容作为STDIN发送,并期望内容作为STDOUT写入工作目录

读取100字节

  • 如果内容为ASCII且与指针文件格式匹配:
    在.git/lfs/objects/{OID}中查找该文件

  • 如果不存在,请从服务器下载。
    把它的内容读给STDOUT听

  • 否则,只需通过STDOUT传递STDIN

当文件添加到存储库时,清除过滤器将运行。
Git将要添加的文件的内容作为STDIN发送,并期望内容作为STDOUT写入Git

  • 在计算其SHA-256签名时,将二进制内容从STDIN流式传输到临时文件
  • 检查
    .git/lfs/objects/{OID}
    处的文件
  • 如果不存在:
    • 将要上载的OID排队
    • 将临时文件移动到
      .git/lfs/objects/{OID}
  • 删除临时文件
  • 将指针文件写入标准输出

Git 2.11(2016年11月)有一份承诺,详细说明了这一点的工作原理:,由Martin Louis Bright提供帮助,签名人:Lars Schneider

转换
:添加
过滤器..处理
选项 Git的clean/smudge机制调用一个外部过滤进程 受过滤器影响的每个水滴。如果Git过滤了很多 blobs,则外部筛选器进程的启动时间可以变为 整个Git执行时间的很大一部分

在初步性能测试中,该开发人员使用了干净/污迹 用golang编写的过滤器,用于过滤12000个文件。这一过程耗时364s 与现有的过滤机制和5s与新的机制。看见 详情如下:

此修补程序添加了
filter..process
string选项,如果 使用时,保持外部筛选进程运行并处理所有BLOB 使用基于数据包格式(
pkt-line
)的协议,通过标准输入和 标准输出

一些关键决定:

  • 长时间运行的过滤过程称为过滤协议 版本2,因为现有的单次触发筛选器调用是 考虑第1版
  • Git发送一条欢迎消息,并期望在消息发出后立即得到响应 外部筛选器进程已启动。这确保了Git不会 如果版本1筛选器与不正确使用,则挂起
    filter..处理版本2过滤器的
    选项。此外 Git可以检测这种错误并警告用户
  • 设置过滤器操作的状态(例如“成功”或“错误”) 在实际响应之前,以及(如有必要!)在 这种两步状态响应的优点是 过滤器提前检测到错误,然后可以进行通信 这和Git甚至不需要创建结构来读取 答复
  • 所有状态响应都是以刷新终止的pkt行列表 数据包。这允许我们发送具有相同数据包的其他状态字段 未来的协议
因此,Git 2.12(2017年第1季度)中设置了警告

参见(2016年12月18日)和(2016年12月3日)作者。
(于2016年12月27日被合并)

文档
:警告清除/污迹过滤器过程值中可能存在的“
=
” 清除/涂抹过滤器进程“
key=value
”对中的路径名值可以 包含“
=
”字符(在中引入)。
在文档中让用户意识到这个问题,添加相应的测试用例,并在
contrib
中示例实现的filter process value parser中修复这个问题


你引用的链接解释得非常透彻。你不明白什么部分?@AndrewC Italic bold text。文本指针和文件二进制数据之间的区别。这只是c:\very_large_video.wmv在硬盘上消耗5Gb与存储字符串并将其存储在其他地方之间的区别。你是说文件数据将l不进行源代码管理?
将文件内容存储在GitHub.com这样的远程服务器上时
对于像我这样努力理解这个综合答案背后的基本思想的人来说,当代码从存储库中签出时,“smudge”命令会运行;而“clean”命令则会反向运行,即当代码为c时ommitted.我认为他们是
type Pointer struct {
    Version string
    Oid     string
    Size    int64
    OidType string
} 
version https://git-lfs.github.com/spec/v1
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size 12345
(ending \n)