git对二进制文件有用吗?


97

git对二进制文件有用吗?

如果我有很多未压缩的文件被修改,而很多压缩文件从未(或几乎从未修改过),那么git能很好地处理吗?例如,如果我插入或移除中间部分,并在末尾附近插入数据,它会像对待文本一样注意到它吗?

如果git不适合二进制文件,我应该考虑使用哪种工具?


1
二进制非常好-我自己使用它
tekknolagi 2011年

这是真的。您可以将/ home置于git版本下,它应该可以很好地工作。
卢瓦克福雷-拉克鲁瓦

1
这与问题的实质不同,该问题已被清楚地指出是担心二进制文件是否对它们进行了差异处理(可能是由于存储库膨胀和性能原因)。但是,我没有对此投票(并且似乎有谁删除了它)。
coreyward 2011年

1
注意:您现在有了git-lts,可以将您的二进制文件存储在其他位置:stackoverflow.com/a/29530784/6309
VonC 2015年

1
它会膨胀.git文件夹吗?
Nikhil '18年

Answers:


47

git开箱即用,可以轻松地将二进制文件添加到其索引中,并以有效的方式存储它们,除非您对大型不可压缩文件进行频繁更新。

问题开始于git需要生成差异和合并:git无法生成有意义的差异,或以任何有意义的方式合并二进制文件。因此,涉及对二进制文件进行更改的所有合并,变基或重整都将涉及您对该二进制文件进行手动冲突解决。

您需要确定二进制文件的更改是否足够少,以至于您可以承受它们在常规git工作流程中引起的额外手动工作,涉及合并,重新设置基数,cherrypicks。


26
我必须指出,二进制文件更改不是问题,可以在多个位置进行更改,然后尝试合并它们。
Winston Ewert

15
git可以产生有意义的差异。使用创建的差异git diff --binary将能够修补二进制文件。
CB Bailey

46

除了其他答案。

  • 您可以使用所谓的二进制差异格式将差异发送到二进制文件。它不是人类可读的,并且只有在存储库中具有准确的原映像(即没有任何绒毛)时才能应用。
    一个例子:

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100
    GIT binary patch
    delta 85
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)C@u6{1-oD!M<s|Fj6
    
    delta 135
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7;
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • 您可以使用TEXTCONV gitattributegit diff二进制文件或二进制文件的部分显示人类可读的差异。例如,对于* .jpg文件,EXIF信息可能有所不同,对于PDF文件,其文本表示(pdf2text或类似名称)之间可能有所不同。

HTH。


5
非常感谢您教我有关gitattributes的信息!开辟了一个全新的可能性世界。
2012年

15

如果您有很大的二进制文件,则可以使用git-annex将数据存储在存储库之外。检出:http : //git-annex.branchable.com/


6
Git-annex非常棒,但是可能更适合于那些不会经常更改的文件,例如音乐文件,图片,PDF等的集合...
sr_

@ sr_,Git LFS也是如此。似乎没有适合这些类型用例的版本控制系统,而以分布式系统为基础(例如Git)。
Marc J. Schmidt

5

我不知道有任何工具尝试存储二进制文件的差异以进行版本控制,但是值得注意的是,即使对于文本文件,Git也不这样做。Git将文件存储为Blob,并在需要时在它们之间进行区分。

如果您想对Photoshop / Illustrator文档之类的内容进行版本控制,则GridIron Flow可能会帮您解决问题。如果您试图使它们在机器之间保持同步,则Dropbox或Rsync可以处理它,但是它们不会进行智能区分。


1
来自git社区书(book.git-scm.com/7_how_git_stores_objects.html):“为了节省空间,Git利用packfile。这是Git只会在第二个文件中保存已更改部分的格式。 ,并具有类似于文件的指针。”
韦恩·康拉德

2
是的,那是/如果您运行git gc垃圾收集。在同一页面上:“由于Git将每个文件的每个版本存储为单独的对象,因此效率可能非常低。想像一下,如果文件长数千行并更改一行,Git将完整地存储第二个文件,这是巨大的空间浪费。”
coreyward 2011年

2
公平的诺夫。git会不时地自动执行gc,至少对于我使用它的项目而言。我不知道它用来决定何时运行的度量标准-也许有些树永远(或很少)触发gc。
韦恩·康拉德

1
在以下手册页中git gc:“鼓励用户在每个存储库中定期运行此任务,以保持良好的磁盘空间利用率和良好的运行性能。某些git命令可能会自动运行git gc;有关详细信息,请参见下面的--auto标志。”
雅各布·阿克博姆

1
@KennyEvitt现在有很多。抽象是一个,而Kactus是另一个在后台使用git的。
coreyward

3

git对二进制文件很好。但是它不能处理像文本文件这样的二进制文件。就像您要合并二进制文件一样。我的意思是,jpeg上的差异永远不会返回任何内容。Git在文本文件上可以很好地工作,并且可能与其他使用二进制文件的解决方案一样糟糕!


2

如果您想要一个版本控制解决方案,则可以考虑使用git-lfs,它具有指向文件的轻量级指针。

这意味着克隆克隆存储库时,它不会下载所有版本,而只会下载已签出的版本。

这里有一个很好的教程如何使用它

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.