是否有可能在git中只存储一个大文件的校验和?

问题描述:

我是一位目前从基因组文件中提取正常大小序列的生物信息学家。一些基因组文件足够大,我不想将它们放到主要的git存储库中,而我将提取的序列放入git中。是否有可能在git中只存储一个大文件的校验和?

是否有可能告诉git“这是一个大文件 - 不要存储整个文件,只要取其校验和,并告诉我该文件是否丢失或修改。”

如果这是不可能的,我想我必须要么git忽略大文件,要么按照this question中的建议,将它们存储在子模块中。

如何将散列存储在文本文件中,然后将文本文件提供给git? 然后你可以编写一个比较哈希值的钩子,所以每当你签入或签出时,你都会被通知缺少/不同的东西。

不完全是你想要的,你仍然必须手动维护文本文件。

我写了一个脚本来做这种事情。您可以将.gitattributes文件中的文件模式放入大型媒体中,而不需要在您的git仓库中使用,并且可以将它们存储在S3上。这只是一个起点,但如果你有兴趣,我认为它是可用的。

http://github.com/schacon/git-media

也许这会帮助你,或者至少你展示它是如何能够做到,你可以自定义您的特定需求。

+0

亚马逊S3不会是我的选择(我们有点紧张让数据的第三方)。您是否计划在某个阶段不使用第三方的选项? – 2009-10-01 23:20:45

+1

@Andrew:我修改了脚本以支持通过SCP在您自己的私人服务器上存储文件,而不是在S3上。或者您可以将文件存储在映射的网络驱动器上。我也加快了一点。看到这里http://github.com/davr/git-media – davr 2010-07-19 17:42:09

在Git中即将发布的将有“refs/replace/”的机制,我认为可以适用于这一目的(假定这种大的媒体文件的数量和它的版本号是不是非常大。 )

苗条叉你的项目,你将有(像Seth wrote)“存根”,以替代大型媒体文件,它作为内容会对SHA-1的大文件的BLOB的文件(来自“ git hash-object -t blob <filename>“)。

然后在叉你的项目,你会使用“refs/replace/”机制(使用git replace)以取代真实内容的“存根”文件。需要一些挂钩来将SHA-1保留在“存根”文件中,与实际的大型媒体文件保持同步。

然后,如果你想完整克隆,你也从“refs/replace/”命名空间;如果你想苗条克隆,你不会获取“refs/replace/”。

注:我还没有真正测试过这样的设置;也是这不是混帐尚未公布,除非你运行“主”

+0

非常酷!我不知道这件事。人们从哪里得到这些信息? git邮件列表,Junio的博客?是否有某种宣传服务,“本周在git.git”或类似Jon Masters的每日LKML摘要播客?我发现在Git中有时很难遵循新的功能,例如git-notes怎么了? – 2009-10-01 17:12:52

+0

我看着git邮件列表,所以它是如何知道的。您可以改为观看RelNotes;关于'refs/replaces /'的信息在http://git.kernel.org/?p=git​​/git.git;a=blob;f=Documentation/RelNotes-1.6.5.txt中(所以它们在git版本1.6.5;我的错误) – 2009-10-01 18:51:26

+0

Errr ... git版本1.6.5是将要发布的**下一个**版本(截至2009年1月10日) – 2009-10-01 18:52:55