web-dev-qa-db-ja.com

Gitがこのテキストファイルをバイナリファイルとして扱うのはなぜですか?

なぜgitがこれを教えてくれるのだろうか?

$ git diff MyFile.txt
diff --git a/MyFile.txt b/MyFile.txt
index d41a4f3..15dcfa2 100644
Binary files a/MyFile.txt and b/MyFile.txt differ

テキストファイルではありませんか?

.gitattributesを確認しましたが、空です。このメッセージが表示されるのはなぜですか?私はもう使っているので差分を取得できません

追加:

ファイルのアクセス許可に@があることに気付きましたが、これは何ですか?これが理由でしょうか?

$ls -all
drwxr-xr-x   5 nacho4d  staff    170 28 Jul 17:07 .
drwxr-xr-x  16 nacho4d  staff    544 28 Jul 16:39 ..
-rw-r--r--@  1 nacho4d  staff   6148 28 Jul 16:15 .DS_Store
-rw-r--r--@  1 nacho4d  staff    746 28 Jul 17:07 MyFile.txt
-rw-r--r--   1 nacho4d  staff  22538  5 Apr 16:18 OtherFile.txt
130
nacho4d

これは単に、gitがファイルの実際の内容を検査するとき(特定の拡張子がバイナリファイルではないことを知らない)ことを意味します-使用できます明示的に伝えたい場合は属性ファイル-manページを参照してください)。

ファイルの内容を検査したところ、基本的なアスキー文字ではないものが見られました。 UTF16であるため、「面白い」文字が含まれることが予想されるため、バイナリであると見なされます。

ファイルに国際化(i18n)または拡張文字形式があるかどうかをgitに伝える方法があります。私はそれを設定するための正確な方法について十分ではありません-あなたはRT [Full] M ;-)する必要があるかもしれません

編集:SOのクイック検索が見つかりました can-i-make-git-recognize-a-utf-16-file-as-text いくつかの手がかりが得られます。

71
Philip Oakley

ファイルのタイプを設定していない場合、Gitはそれを自動的に判別しようとし、本当に長い行と多分 ワイド文字 (たとえばUnicode)を持つファイルはバイナリとして扱われます。 。gitattributes ファイルを使用すると、Gitがファイルを解釈する方法を定義できます。 diff属性を設定すると、Gitはファイルの内容をテキストとして解釈し、通常のdiffを実行します。

。gitattributesをリポジトリルートフォルダーに追加し、diffを設定するだけですパスまたはファイルの属性。以下に例を示します。

src/Acme/DemoBundle/Resources/public/js/i18n/* diff
doc/Help/NothingToSay.yml                      diff
*.css                                          diff

ファイルに属性が設定されているかどうかを確認する場合は、 git check-attr を使用して確認できます。

git check-attr --all -- src/my_file.txt

Gitの属性に関するもう1つの素晴らしいリファレンスは、 here です。

35
naitsirch

この問題は、Git GUIとSourceTreeがJava/JSファイルをバイナリとして扱っていたため、違いが見えなかったために発生していました。

次の内容で.git\infoフォルダーに「attributes」という名前のファイルを作成すると、問題が解決しました

*.Java diff
*.js diff
*.pl diff
*.txt diff
*.ts diff
*.html diff

すべてのリポジトリに対してこの変更を行う場合は、次の場所に属性ファイルを追加できます。$ HOME/.config/git/attributes

19
Hemant

Gitは、テキストファイルに1本の非常に長い行がある場合、それがバイナリであると判断します。長い文字列を分割し、それを複数のソースコード行に変えたところ、ファイルが突然「バイナリ」から(SmartGitで)表示できるテキストファイルになりました。

そのため、エディターで「Enter」を押すことなく右に入力し続けないでください。そうしないと、Gitは後でバイナリファイルを作成したと判断します。

18
Chris Murphy

新しいエディターでファイルの1つを編集した後、この同じ問題が発生しました。新しいエディターは、古いエディター(UTF-8)とは異なるエンコード(Unicode)を使用していました。そのため、新しいエディターにUTF-8でファイルを保存するように指示しただけで、gitは再び変更を適切に表示し、バイナリファイルとして表示しませんでした。

問題は、単にgitが異なるエンコードタイプのファイルを比較する方法を知らないことだと思います。したがって、一貫性が保たれている限り、使用するエンコードタイプは実際には関係ありません。

私はそれをテストしませんでしたが、新しいUnicodeエンコーディングでファイルをコミットしたかどうかは確信しています。次回そのファイルに変更を加えたときには、変更が適切に表示され、バイナリとして検出されませんでした。その後、UTF-8ファイルとUnicodeファイルではなく、2つのUnicodeエンコードファイルを比較していました。

Notepad ++ のようなアプリを使用して、テキストファイルのエンコードタイプを簡単に確認および変更できます。 Notepad ++でファイルを開き、ツールバーの[エンコード]メニューを使用します。

9
deadlydog

私も同じ問題を抱えています。 Googleでソリューションを検索したときにスレッドを見つけましたが、まだ手がかりが見つかりません。しかし、私は勉強した後にその理由を見つけたと思う、以下の例は私の手がかりを明確に説明します。

    echo "new text" > new.txt
    git add new.txt
    git commit -m "dummy"

現時点では、ファイルnew.txtはテキストファイルと見なされます。

    echo -e "newer text\000" > new.txt
    git diff

この結果が得られます

diff --git a/new.txt b/new.txt
index fa49b07..410428c 100644
Binary files a/new.txt and b/new.txt differ

これを試して

git diff -a

あなたは以下になります

    diff --git a/new.txt b/new.txt
    index fa49b07..9664e3f 100644
    --- a/new.txt
    +++ b/new.txt
    @@ -1 +1 @@
    -new file
    +newer text^@
6
howard

このケースでは、.htmlファイルを変更しようとするたびにバイナリとして認識されていました。差分が表示されないのは非常にクールです。正直に言うと、ここではすべての解決策を確認しませんでしたが、私たちにとってうまくいったのは次のことです

  1. ファイルを削除し(実際にデスクトップに移動し)、git deletionをコミットしました。 GitはDeleted file with mode 100644 (Regular) Binary file differsと言います
  2. ファイルを再度追加しました(実際にデスクトップからプロジェクトに戻しました)。 GitはNew file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletionsと言いますファイルは通常のテキストファイルとして追加されます

これ以降、ファイルに加えた変更は通常のテキスト差分として表示されます。これらのコミットを押しつぶすこともできます(1、2、および3が実際の変更です)が、私は将来、私が何をしたかを見ることができます。スカッシュ1および2は、バイナリの変更を示します。

4
StuFF mc

この役立つ回答 ごとに、特定の方法でファイルを処理する理由をGitに直接問い合わせることができます。

cd directory/of/interest
file *

次のような有用な出力が生成されます。

$ file *
CR6Series_stats resaved.dat: ASCII text, with very long lines, with CRLF line terminators
CR6Series_stats utf8.dat:    UTF-8 Unicode (with BOM) text, with very long lines, with CRLF line terminators
CR6Series_stats.dat:         ASCII text, with very long lines, with CRLF line terminators
readme.md:                   ASCII text, with CRLF line terminators
3
patricktokeeffe

これは、TF-8 with BOM encodingを持つテキストファイルによっても(少なくともWindowsで)発生します。エンコーディングを通常のTF-8に変更すると、Gitはすぐにファイルをtype = textとして認識します

2
Robba

.gitignoreに目的別にダブル\r(キャリッジリターン)シーケンスが含まれるインスタンスがありました。

そのファイルはgitによってバイナリとして識別されました。 .gitattributesファイルの追加が役立ちました。

# .gitattributes file
.gitignore diff
1
Erik Zivkovic

git check-attr --all -- src/my_file.txtがファイルがバイナリとしてフラグ付けされていることを示しており、.gitattributesでバイナリとして設定していない場合は、/.git/info/attributesで確認してください。

0
coberlin

Aux.jsをSig.jsなどの別の名前に変更します。

ソースツリーではバイナリファイルとして表示されますが、ステージング(追加)してコミットできます。

0
Oscar Zhou1989