gitはバイナリファイルに適していますか?


96

gitはバイナリファイルに適していますか?

多くの非圧縮ファイルが変更されており、多くの圧縮ファイルが変更されていない(またはほとんど変更されていない)場合、Gitで適切に処理できますか?たとえば、途中でデータを挿入または削除し、最後の方にデータを挿入すると、テキストの場合と同じように気づきますか?

gitがバイナリファイルでうまくいかない場合、どのツールを検討すればよいですか?


1
バイナリで非常に良い-私はそれを自分で使用しています
tekknolagi 2011年

それはちょっと本当です。/ homeをgitリビジョンに置くと、かなりうまくいくはずです。
ロイック・フォーレ-ラクロワ

1
これは、(おそらくリポジトリの肥大化とパフォーマンスの理由で)バイナリファイルにdiffが実行されているかどうかについて懸念していると明確に指摘されている質問の趣旨ではありません。しかし、私はそれを反対票を投じませんでした(そしてそれ以降、誰もがそれを削除したようです)。
coreyward 2011年

1
注:バイナリを他の場所に保存するためのgit-ltsがあります:stackoverflow.com/a/29530784/6309
VonC

1
それは.gitフォルダを膨らませますか?
Nikhil、

回答:


47

箱から出してすぐに、gitはバイナリファイルをインデックスに簡単に追加できます。また、大きな非圧縮ファイルを頻繁に更新しない限り、効率的な方法でそれらを保存できます。

問題はgitが差分とマージを生成する必要があるときに始まります:gitは意味のある差分を生成したり、意味のある方法でバイナリファイルをマージしたりできません。したがって、バイナリファイルへの変更を含むすべてのマージ、リベース、またはチェリーピックでは、そのバイナリファイルに対して手動で競合を解決する必要があります。

バイナリファイルの変更が、マージ、リベース、チェリーピックを含む通常のgitワークフローで発生する追加の手動作業に耐えられるほどまれであるかどうかを判断する必要があります。


25
バイナリファイルの変更は問題ではないことを指摘しなければなりません。複数の場所で変更を加えてから、それらをマージしようとするのは問題です。
Winston Ewert、2011年

15
gitは意味のある差分を生成できます。で作成されたdiffは、git diff --binaryバイナリファイルにパッチを適用できるようになります。
CBベイリー

46

他の回答に加えて。

  • いわゆるバイナリ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
    
  • textconv gitattributeを使用してgit diff、バイナリファイルまたはバイナリファイルの一部の人間が読める差分を表示することができます。たとえば、*。jpgファイルの場合、EXIF情報が異なる場合があり、PDFファイルの場合、テキスト表現(pdf2textまたはそのようなもの)が異なる場合があります。

HTH。


5
gitattributesについて教えてくれてありがとう!可能性の全く新しい世界を開きます。
hermannloose 2012年

15

非常に大きなバイナリファイルがある場合は、git-annexを使用して、リポジトリの外部にデータを保存できます。チェックアウト:http : //git-annex.branchable.com/


6
Git-annexは非常にすばらしいですが、それほど頻繁変更されないファイル、たとえば音楽ファイル、写真、PDFなどのコレクションに適しています
sr_

@sr_はまさにGit LFSもそうです。これらのタイプのユースケースに適したバージョン管理システムはなく、ベースとなる分散システム(Gitなど)もないようです。
マークJ.シュミット

5

バージョン管理のためにバイナリファイルの差分を保存しようとするツールは知りませんが、Gitがテキストファイルに対してもこれを実行しないことは注目に値します。Gitはファイルをblobとして保存し、必要に応じてそれらの間で差分を取ります。

Photoshop / Illustratorドキュメントなどのバージョン管理を行う場合は、GridIron Flow役立ちます。マシン間で同期を維持しようとしている場合、DropboxまたはRsyncはそれを処理できますが、インテリジェントな比較は行いません。


1
gitコミュニティブック(book.git-scm.com/7_how_git_stores_objects.html)から:「そのスペースを節約するために、Gitはパックファイルを使用します。これは、Gitが2番目のファイルで変更された部分のみを保存する形式です、それに似たファイルへのポインタが付いています。」
ウェインコンラッド

2
ええ、それはあなたgit gcがガベージコレクションをするために実行する場合です。同じページから:「Gitは各ファイルの各バージョンを個別のオブジェクトとして保存するため、かなり非効率になる可能性があります。数千行の長さのファイルがあり、1行を変更することを想像してください。Gitは2番目のファイル全体を保存します。スペースの非常に大きな無駄です。」
coreyward 2011年

2
フェアナフ。gitは時々自動的にgcを実行しますが、少なくとも私が使用するプロジェクトではそうです。実行するタイミングを決定するために使用するメトリックがわからない-おそらく、GCをトリガーしない(またはめったにない)ツリーがあるかもしれません。
ウェインコンラッド

1
のmanページからgit gc:「ユーザーは、このタスクを各リポジトリ内で定期的に実行して、ディスク容量の使用率と動作パフォーマンスを維持することをお勧めします。一部のgitコマンドは、git gcを自動的に実行する場合があります。詳細については、以下の--autoフラグを参照してください。 」
Jacob Akkerboom

1
@KennyEvitt今トンあります。Abstractが1つ、Kactusがもう1つ、裏でgitを使用しています。
coreyward 2018

3

gitはバイナリに適しています。ただし、テキストファイルのようなバイナリは処理されません。バイナリファイルをマージするようなものです。つまり、jpegのdiffは何も返しません。Gitはテキストファイルで非常にうまく機能し、おそらくバイナリファイルを使用する他のすべてのソリューションと同じくらい良くありません!


2

バージョニングのソリューションが必要な場合は、ファイルへの軽量ポインタを持つgit-lfsを検討する必要があります。

これは、リポジトリを複製するときに、すべてのバージョンをダウンロードするのではなく、チェックアウトされたバージョンのみをダウンロードすることを意味します。

ここにそれを使用する方法の素晴らしいチュートリアルがあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.