10

我会将大量数据置于版本控制之下,即包含数百个大小约为 500Mb 的文件的目录结构(深度<=5)。

我需要的是一个可以帮助我的系统: - 检测文件是否已更改 - 检测文件是否被添加/删除 - 将整个存储库克隆到另一个位置 - 存储“检查点”并稍后恢复

我不需要 sha1 来检测变化,更快的东西是可以接受的。

git值得吗?有更好的选择吗?

4

5 回答 5

10

正如我在“什么是 Git 限制”中提到的,Git 不是用来管理大文件(或大二进制文件)的。

如果您需要执行以下操作,则需要 Git:

  • 知道文件中实际发生了什么变化。但是对于目录级别,其他答案更好(Unison 或 rsynch)
  • 在您的开发数据和那些大型资源之间保持紧密接近(即“相同的引用”)。只有一个引用会有所帮助,但是你需要一个 Git 的分支,比如git-bigfiles来有效地管理它们。

注意:还在用Git,可以试试这个方法

不幸的是,rsync对于我们的目的也不是很完美。

  • 首先,它并不是真正的版本控制系统。如果要存储文件的多个修订版,则必须制作多个副本,这很浪费,或者xdelta它们很乏味(并且可能重新组装很慢,并且很难修剪中间版本),或者将它们签入 git ,由于您的文件太大,它仍然会崩溃。
  • 再加上 rsync 真的无法正确处理文件重命名 - 根本没有。

好的,另一个想法怎么样:让我们将文件分成块,并将这些块中的每一个分别检查到 git中。
那么 git 的 delta 压缩一次不会有太多可咀嚼的东西,我们只需要发送修改过的块......

基于,在这个 Git repo 中提供gzip --rsyncable了一个POC 。

于 2009-11-19T11:35:16.390 回答
8

git-annex 是解决这个问题的方法。它不是将大文件数据直接存储在 git 中,而是将其存储在键/值存储中。然后将密钥的符号链接签入 git,作为实际大文件的代理。

http://git-annex.branchable.com

于 2010-11-18T18:55:45.623 回答
1

Unison File Synchroniser是维护大型二进制文件的多个副本的出色工具。除了存储检查点之外,它会完成您要求的一切 - 但您可以使用 rsync 硬链接副本来完成。

于 2009-11-19T10:48:40.693 回答
1

如果您使用的是 unix 系统(可能是,因为您使用的是 git):

  • 对所有小东西使用 git repo。
  • 将单个“large_files”文件夹中的大文件符号链接到存储库中的适当位置。
  • 使用更传统的非版本控制备份系统备份 large_files 文件夹,如果您需要将它们传递给其他人,不时将它们全部捆绑到一个 zip 文件中。

这样,您就可以获得 git 的好处,保留您想要的任何树结构,并且将大型文件备份到其他地方,尽管看起来仍然在正常的文件夹层次结构中。

于 2009-11-19T23:52:59.157 回答
0

也许像 rsync 这样的东西更适合您的需求(如果您只想要一些备份,没有并发,合并,分支等)

于 2009-11-19T10:46:18.843 回答