なぜ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
これは単に、gitがファイルの実際の内容を検査するとき(特定の拡張子がバイナリファイルではないことを知らない)ことを意味します-使用できます明示的に伝えたい場合は属性ファイル-manページを参照してください)。
ファイルの内容を検査したところ、基本的なアスキー文字ではないものが見られました。 UTF16であるため、「面白い」文字が含まれることが予想されるため、バイナリであると見なされます。
ファイルに国際化(i18n)または拡張文字形式があるかどうかをgitに伝える方法があります。私はそれを設定するための正確な方法について十分ではありません-あなたはRT [Full] M ;-)する必要があるかもしれません
編集:SOのクイック検索が見つかりました can-i-make-git-recognize-a-utf-16-file-as-text いくつかの手がかりが得られます。
ファイルのタイプを設定していない場合、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 です。
この問題は、Git GUIとSourceTreeがJava/JSファイルをバイナリとして扱っていたため、違いが見えなかったために発生していました。
次の内容で.git\infoフォルダーに「attributes」という名前のファイルを作成すると、問題が解決しました
*.Java diff
*.js diff
*.pl diff
*.txt diff
*.ts diff
*.html diff
すべてのリポジトリに対してこの変更を行う場合は、次の場所に属性ファイルを追加できます。$ HOME/.config/git/attributes
Gitは、テキストファイルに1本の非常に長い行がある場合、それがバイナリであると判断します。長い文字列を分割し、それを複数のソースコード行に変えたところ、ファイルが突然「バイナリ」から(SmartGitで)表示できるテキストファイルになりました。
そのため、エディターで「Enter」を押すことなく右に入力し続けないでください。そうしないと、Gitは後でバイナリファイルを作成したと判断します。
新しいエディターでファイルの1つを編集した後、この同じ問題が発生しました。新しいエディターは、古いエディター(UTF-8)とは異なるエンコード(Unicode)を使用していました。そのため、新しいエディターにUTF-8でファイルを保存するように指示しただけで、gitは再び変更を適切に表示し、バイナリファイルとして表示しませんでした。
問題は、単にgitが異なるエンコードタイプのファイルを比較する方法を知らないことだと思います。したがって、一貫性が保たれている限り、使用するエンコードタイプは実際には関係ありません。
私はそれをテストしませんでしたが、新しいUnicodeエンコーディングでファイルをコミットしたかどうかは確信しています。次回そのファイルに変更を加えたときには、変更が適切に表示され、バイナリとして検出されませんでした。その後、UTF-8ファイルとUnicodeファイルではなく、2つのUnicodeエンコードファイルを比較していました。
Notepad ++ のようなアプリを使用して、テキストファイルのエンコードタイプを簡単に確認および変更できます。 Notepad ++でファイルを開き、ツールバーの[エンコード]メニューを使用します。
私も同じ問題を抱えています。 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^@
このケースでは、.htmlファイルを変更しようとするたびにバイナリとして認識されていました。差分が表示されないのは非常にクールです。正直に言うと、ここではすべての解決策を確認しませんでしたが、私たちにとってうまくいったのは次のことです
git deletion
をコミットしました。 GitはDeleted file with mode 100644 (Regular) Binary file differs
と言いますNew file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletions
と言いますファイルは通常のテキストファイルとして追加されますこれ以降、ファイルに加えた変更は通常のテキスト差分として表示されます。これらのコミットを押しつぶすこともできます(1、2、および3が実際の変更です)が、私は将来、私が何をしたかを見ることができます。スカッシュ1および2は、バイナリの変更を示します。
この役立つ回答 ごとに、特定の方法でファイルを処理する理由を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
これは、TF-8 with BOM encodingを持つテキストファイルによっても(少なくともWindowsで)発生します。エンコーディングを通常のTF-8に変更すると、Gitはすぐにファイルをtype = textとして認識します
.gitignore
に目的別にダブル\r
(キャリッジリターン)シーケンスが含まれるインスタンスがありました。
そのファイルはgitによってバイナリとして識別されました。 .gitattributes
ファイルの追加が役立ちました。
# .gitattributes file
.gitignore diff
git check-attr --all -- src/my_file.txt
がファイルがバイナリとしてフラグ付けされていることを示しており、.gitattributes
でバイナリとして設定していない場合は、/.git/info/attributes
で確認してください。
Aux.jsをSig.jsなどの別の名前に変更します。
ソースツリーではバイナリファイルとして表示されますが、ステージング(追加)してコミットできます。