Git大文件存储背后的存储机制是什么?
Github最近在git中引入了一种新的方法,用于以不同的方式存储大型文件。扩展名用Git中的文本指针替换大型文件的确切含义是什么?您可以在下面的中看到: 和来源意味着Git大文件存储背后的存储机制是什么?,git,github,Git,Github,Github最近在git中引入了一种新的方法,用于以不同的方式存储大型文件。扩展名用Git中的文本指针替换大型文件的确切含义是什么?您可以在下面的中看到: 和来源意味着git lfs可以使用来: 签出时下载实际文件 提交时将其存储在外部源中 见: Git LFS的核心思想是,不向Git存储库写入大blob,只写入指针文件 Git LFS需要一个URL端点来与远程服务器通信。 对于不同的远程设备,Git存储库可以有不同的Git LFS端点 实际文件上载到服务器或从服务器下载,该服务器尊重文件
git lfs
可以使用来:
- 签出时下载实际文件
- 提交时将其存储在外部源中
对于不同的远程设备,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筛选器与不正确使用,则挂起
选项。此外 Git可以检测这种错误并警告用户filter..处理版本2过滤器的
- 设置过滤器操作的状态(例如“成功”或“错误”) 在实际响应之前,以及(如有必要!)在 这种两步状态响应的优点是 过滤器提前检测到错误,然后可以进行通信 这和Git甚至不需要创建结构来读取 答复
- 所有状态响应都是以刷新终止的pkt行列表 数据包。这允许我们发送具有相同数据包的其他状态字段 未来的协议
(于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)