【问题标题】:Is git good with binary files? [closed]git 对二进制文件好吗? [关闭]
【发布时间】:2011-01-15 00:08:01
【问题描述】:

git 对二进制文件好吗?

如果我有很多未压缩的文件被修改,而许多压缩文件从未(或几乎从未)修改过,git 会处理好它吗?例如,如果我插入或删除中间并在接近末尾的位置插入数据,它会像处理文本一样注意到它吗?

如果 git 不擅长处理二进制文件,我可以考虑使用什么工具?

【问题讨论】:

  • 二进制非常好 - 我自己用它
  • 这是真的。您可以将您的 /home 置于 git 修订版中,它应该可以很好地工作。
  • 这不符合问题的精神,它被明确指出是担心二进制文件是否对它们进行了差异(可能是出于存储库膨胀和性能原因)。但是,我没有对它投反对票(而且看来投反对票的人已经删除了它)。
  • 注意:您现在有了 git-lts,可以将二进制文件存储在其他地方:stackoverflow.com/a/29530784/6309
  • 它会膨胀 .git 文件夹吗?

标签: git


【解决方案1】:

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

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

您需要确定二进制文件更改是否足够少,以至于您可以忍受它们在正常的 git 工作流程中导致的额外手动工作,包括合并、变基、cherrypicks。

【讨论】:

  • 我不得不指出,二进制文件更改不是问题,在多个地方进行更改然后尝试合并它们。
  • git 可以生成有意义的差异。使用git diff --binary 创建的差异将能够修补二进制文件。
【解决方案2】:

除了其他答案。

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

    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。

【讨论】:

  • 非常感谢您教我有关 gitattributes 的知识!开辟了一个全新的可能性世界。
【解决方案3】:

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

【讨论】:

  • Git-annex 非常棒,但可能更适合不经常更改的文件,例如音乐文件、图片、PDF 的集合......
  • @sr_ 完全正确,Git LFS 也是如此。似乎没有适合这些类型用例的版本控制系统,同时也有一个分布式系统作为基础(如 Git)。
【解决方案4】:

git 对二进制文件很好。但它不会处理像文本文件这样的二进制文件。就像您要合并二进制文件一样。我的意思是,jpeg 上的差异永远不会返回任何东西。 Git 与文本文件配合得非常好,并且可能与二进制文件的所有其他解决方案一样糟糕!

【讨论】:

    【解决方案5】:

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

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

    这是一个很好的tutorial 使用方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-25
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多