git对二进制文件好吗?

87 git

git对二进制文件好吗?

如果我修改了很多未压缩的文件,并且许多压缩文件从未(或几乎从未)被修改过,那么git会处理得好吗?例如,如果我插入或删除中间并在末尾附近插入数据,它会注意到它与文本一样吗?

如果git对二进制文件不好,我可以考虑使用什么工具?

Jak*_*ski 41

除了其他答案.

  • 您可以使用所谓的二进制diff格式将diff发送到二进制文件.它不是人类可读的,只有在您的存储库中有精确的原像时才能应用它,即没有任何模糊.
    一个例子:

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以使用TEXTCONV gitattributegit diff二进制文件或二进制文件的部分显示人类可读的差异.例如,对于*.jpg文件,它可能与EXIF信息不同,对于PDF文件,它们的文本表示(pdf2text或类似的东西)之间可能存在差异.

HTH.

  • 非常感谢教我关于gitattributes!打开一个全新的可能性世界. (5认同)

ndi*_*dim 40

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

当git需要生成差异和合并时,问题就开始了:git无法生成有意义的差异,或者以任何有意义的方式合并二进制文件.因此,涉及更改二进制文件的所有合并,rebase或cherrypicks将涉及您对该二进制文件进行手动冲突解决.

您需要确定二进制文件的更改是否足够罕见,您可以使用它们在涉及合并,rebase,cherrypicks的正常git工作流中引起的额外手动工作.

  • 我必须指出二进制文件更改不是问题,在多个位置进行更改然后尝试合并它们. (20认同)
  • git可以生成有意义的差异.使用`git diff --binary`创建的diff将能够修补二进制文件. (12认同)

Joh*_*ibb 13

如果你有非常大的二进制文件,你可以使用git-annex将数据存储在存储库之外.查看:http://git-annex.branchable.com/

  • Git-annex非常精彩,但可能更适合那些*经常不会改变*的文件,例如音乐文件,图片,PDF,... (4认同)

Loï*_*oix 5

git 对二进制文件很好。但它不会像文本文件那样处理二进制文件。就像你想合并二进制文件一样。我的意思是,jpeg 上的差异永远不会给你任何回报。Git 与文本文件一起工作得很好,可能与其他二进制文件解决方案一样糟糕!


cor*_*ard 5

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

如果您希望对Photoshop/Illustrator文档等版本进行版本控制,GridIron Flow可能会为您提供帮助.如果你试图让它们在机器之间保持同步,Dropbox或Rsync可以处理它,但它们不会进行智能差异化.

  • 是的,那就是/当你运行`git gc`进行垃圾收集时.从同一页面:"由于Git将每个文件的每个版本存储为一个单独的对象,它可能会变得非常低效.想象一下,文件有几千行并且改变一行.Git会将第二个文件存储在整个文件中.是一个巨大的浪费空间." (2认同)
  • 公平的'努力.git现在会自动执行gc,至少对我使用它的项目来说.我不知道它用什么度量来决定何时运行 - 也许有些树永远不会(或很少)触发gc. (2认同)

dan*_*ael 5

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

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

这是一个关于如何使用它的很好的教程