gitでバイナリファイルを比較するにはどうすればよいですか?


28

gitでバイナリファイルを比較するには、difftoolを設定する必要があると思います。

どのdifftoolsが機能しますか?パラメーターはどのように配置しますか?


バイナリファイルの差分ツールからどのような出力が得られると期待していますか?これはどのようなバイナリファイルですか?テキスト形式にレンダリングしてから比較できるものですか?
ゾレダチェ14年

回答:


22

あなたは、設定することができますtextconvファイルタイプのための設定オプションを。gitattributes(5)の「バイナリファイルのテキスト差分の実行」を参照してください。使用すべきものはファイルタイプによって異なります。

例1

zipファイルの内容を比較するとします。その場合、以下を$ GIT_DIR / configファイルまたは$ HOME / .gitconfigに配置する必要があります。

[diff "zip"]
    textconv = unzip -v

次回、レポジトリ内のzipファイルの差分を要求すると、unzip -vバージョンと差分の両方が呼び出され、結果のテキストが差分されます。

例2

pdfファイルの場合は、たとえば次を使用できますpdfinfo

[diff "pdf"]
    textconv = pdfinfo

例3

ファイルタイプに特定の情報ユーティリティがない場合は、たとえば次を使用できますhexdump(FreeBSDおよびOSXに付属、Linuxでも利用可能):

[diff "bin"]
    textconv = hexdump -v -C

16進数でそれを比較できます。バイト数が異なること、またはバイトがどの位置で異なるかを知っているだけで十分です。gitリポジトリを複製してHex Fiendを使用することになり、両方のバージョンのファイルをチェックアウトできました。これは、gitでプログラムを起動する方法がわからなかったためです。
ニックレタラック14年

@NickRetallack:追加例を参照してください。
ローランドスミス14年

2
私はGitの設定に例3を追加しましたが、私は「gitの差分」を行うとき、それはまだちょうど私と同じショートメッセージを与える:「バイナリは/ファイルaとbをファイル/ファイル異なり」
ニックレタラック

1
あなたがのlibmagic使用したい場合は、確認するためにGitのソースコードを検討する必要があります場合は、その作品...
ローランドスミス

5
* .bin diff = binを.gitattributesに追加した後、ようやくこれが機能するようになりました
ジャスティンロウ

11

Roland Smithからの回答は役に立ちましたが、現在は不完全です(コメントを参照)-これには2つの部分があります。

リポジトリの.git/configファイルまたは個人用グローバル~/.gitconfigファイルに新しいdiffコマンドを定義できます。たとえば、次を使用した16進diffコマンドhexdumpです。

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

次に、リポジトリの.gitattributesファイルを使用して、この特別なdiffコマンドで使用するファイルをgitに伝える必要があります。

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

.gitignoreファイルと同様に、ファイルを.gitattributesリポジトリにチェックインする必要があります。

私の場合、いくつかの異なるファイル拡張子があり、それらをバイナリとして扱いたい(たとえば、Windowsでgitを使用している場合、行末の変換を避けます)hexdump

https://github.com/peterjc/galaxy_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

画像ファイルで使用するhexdump diffコマンドを定義する別の例については、https://github.com/resin-io/etcher/pull/1367も参照してください


.gitattributesグローバルを設定することもでき[diff]ます(グローバルのエントリに合わせて.gitconfig)。.gitattributesリポジトリのローカルを作成する場合.gitconfig、セキュリティ上の理由からこれらはリモートにプッシュされないため、ユーザーはローカルリポジトリ設定を変更する必要があります。どちらの方法でも、各ユーザーはこの動作を有効にするにはローカルファイル/構成を何らかの方法で更新する必要があります。で.gitconfig下の[core]追加attributesfile = c:/users/<username>/.gitattributesまたはどこにあなたはそれがグローバル(でもウィンドウで、forwardslashesに注意してください)作れば、それを保存したいです。
LightCC

10

バイナリファイルの差分をプレーンテキストの差分として表示するようにgitを強制--textするには、次のようなオプションを使用します。

git diff --text

-1

上記は包括的な方法です。ただし、いくつかのファイルに対してそれを行う必要がある場合は、次の方法を使用します。

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

ここでは使用してvimdiffいますが、他のツールを使用できます。これを繰り返し行う必要がある場合は、上記を組み合わせて小さなスクリプトにすることもできます。


これにより、ファイルへの変更が破棄されたように見えます(コミットされたバージョンが必要な場所に空のファイルが作成されました)。
エルハニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.