可以将zip文件作为目录和zip文件中的文件作为blob?

场景

想象一下,我被迫与我的一些文件一直存储在.zip文件中。 压缩文件中的一些文件是小文本文件,经常变化,而其他文件较大,但幸运的是相当静态(如图像)。

如果我想把这些zip文件放在一个git仓库中,每个zip都被当作一个blob,所以每当我提交的仓库增长的zip文件的大小…即使只有一个小的文本文件里面改变!

为什么这是现实的

MS Word 2007/2010 .docx和Excel .xlsx文件是ZIP文件…

我想要的是

有没有办法告诉git不要把zip作为文件,而是作为目录,把它们的内容视为文件?

优点

  • 小得多的回购规模,即更快的转移/备份
  • 用Git显示更改到zip会自动工作

但是它不能工作,你说?

我意识到,没有额外的元数据,这将导致一定程度的模糊性:在git checkout git将不得不决定是否将foo.zip/bar.txt创build为常规目录或zip文件中的文件。 但是,这可以通过configuration选项来解决,我想。

两个想法如何做 (如果它不存在)

  • 在git中使用诸如minizipIO::Compress::Zip类的库
  • 以某种方式添加文件系统层,使git实际上将zip文件视为目录开始

这不存在,但它可以很容易地存在于当前的框架。 正如git在执行差异时显示二进制文件或ascii文件的行为不同一样,可以通过configuration界面告诉特定的文件types。

如果你不想改变代码库(虽然这是一个很酷的想法),你也可以使用pre-commit和post-checkout钩子来解压和存储文件,然后在结帐时将它们返回到.zip状态。 您将不得不将操作限制为仅由git add指定的那些文件blob /索引。

无论哪种方式是一个工作 – 这只是一个问题,其他git表示是否知道发生了什么事情,并发挥很好。

使用bup (在GitMinutes#24中详细介绍)

它是唯一的git-like系统,用于处理大型(甚至是非常大型的)文件,这意味着每个版本的zip文件只会增加其delta的回购(而不是一个完整的附加副本)

结果是一个实际的git回购,一个普通的Git命令可以读取。

我详细说明了如何在“ 与大文件git”中与 Git不同。


任何其他解决方法(如git-annex )并不完全令人满意,详见“ git-annex with large files ”。

不确定是否有人对这个问题仍然感兴趣。 我面临同样的问题,这是我的解决scheme,使用git文件filter。

编辑:首先,我可能没有说清楚,但这是OP的问题的答案! 在评论之前阅读整个句子。 此外,感谢@Ton Krijthe的build议,澄清解决scheme。

我的解决scheme是使用一个filter将zip文件“平放”成一个单片扩展(可能是巨大的)文本文件。 在git添加/提交过程中,压缩文件会自动扩展为正常文本格式的文本格式,在结帐时,它会自动再次压缩。

文本文件由logging组成,每个代表一个zip文件。 所以你可以把这个文本文件的东西是一个基于文本的图像的原始压缩。 如果zip中的文件是文本文件,则将其复制到文本文件中; 否则,在复制到文本格式文件之前,它是base64编码的。 这使得文本文件始终是一个文本文件。

尽pipe这个filter并没有使zip中的每个文件都成为一个blob,但是文本文件被映射成一行,这是diff的单位,而二进制文件的变化可以通过它们对应的base64的更新来表示,我想这相当于OP想象的是什么。

有关详细信息和原型代码,您可以阅读以下链接:

Zippey Git文件filter

此外,信贷的地方,这个解决scheme启发我: 文件filter如何工作的说明

http://tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/

(注意:根据Ruben的评论,这只是为了获得适当的差异,而不是解压缩文件。)

打开你的〜/ .gitconfig文件(如果不存在就创build)并添加下面的节:

[diff“zip”] textconv = unzip -c -a

它所做的是使用“unzip -c -a FILENAME”将您的zip文件转换为ASCII文本(将unzip -c解压缩到STDOUT)。 接下来是创build/修改文件REPOSITORY / .gitattributes并添加以下内容

* .pptx diff = zip

它告诉git使用configuration中的zip-diffing描述来获取给定掩码的文件(本例中以.pptx结尾的所有内容)。 现在,git diff会自动解压缩文件,并对ASCII输出进行比较,这比“二进制文件不同”要好一些。 另一方面,对于相应的pptx文件的XML文件来说,这并没有什么帮助,但是对于包含文本的ZIP文件(比如源代码压缩文件)来说,这实际上相当方便。

我想你将需要安装一个zip文件到文件系统。 我还没有使用它,但考虑FUSE:

http://code.google.com/p/fuse-zip/

还有用于Windows和Linux的ZFS:

http://users.telenet.be/tfautre/softdev/zfs/

通常,应用程序的预压缩文件存在问题,因为他们希望压缩方法和文件顺序是他们select的文件顺序。 我相信公开的.odf文件有这个问题。

也就是说,如果您只是简单地使用any-old-zip作为保存东西的方法,那么您应该能够创build一些简单的别名,在需要时将解压缩并重新压缩。 最新的Msysgit(又名Git for Windows)现在已经在shell代码上压缩和解压,所以你可以在别名中使用它们。

我目前正在使用的项目使用zips作为主要的本地版本控制/存档,所以我也试图得到一个可行的一组别名,将这几百个zip文件吸入到git中(然后再把它们取出来;-)同事们都很开心