Почему 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 и пуст. Почему я получаю это сообщение? Я не могу получить diffs, поскольку я больше использую

ДОБАВЛЕНО:

Я заметил, что в разрешениях файла есть @, что это такое? Может ли это быть причиной?

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

Ответ 1

Это просто означает, что когда git проверяет фактическое содержимое файла (он не знает, что какое-либо данное расширение не является двоичным файлом - вы можете использовать файл атрибутов, если хотите явно указать его - см. man pages).

Проверяя содержимое файла, он увидел материал, который не имеет базовых символов ascii. Будучи UTF16, я ожидаю, что у него будут "смешные" персонажи, поэтому он будет считать его двоичным.

Есть способы сообщить git, если у вас есть интернационализация (i18n) или расширенные форматы символов для файла. Я недостаточно разбираюсь в точном методе настройки - вам может понадобиться RT [Full] M;-)

Изменить: быстрый поиск SO нашел can-i-make-git-recognize-a-utf-16-file-as-text, который должен дать вам несколько подсказок.

Ответ 2

Если вы не задали тип файла, 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 можно найти здесь.

Ответ 3

Git даже определит, что он двоичный, если у вас есть одна сверхдолгая строка в текстовом файле. Я разбил длинную строку, превратив ее в несколько строк исходного кода, и внезапно файл перешел от "двоичного" к текстовому файлу, который я мог видеть (в SmartGit).

Так что не набирайте слишком далеко вправо, не нажимая 'Enter' в свой редактор, иначе в дальнейшем Git подумает, что вы создали двоичный файл.

Ответ 4

У меня была эта проблема, когда Git GUI и SourceTree обрабатывали файлы Java/JS как двоичные и, следовательно, не могли видеть разницу

Создание файла с именем "attributes" в .git\info папке со следующим содержимым разрешило проблему

*.java diff
*.js diff
*.pl diff
*.txt diff

Если вы хотите сделать это изменение для всех репозиториев, вы можете добавить файл атрибутов в следующем месте $ HOME/.config/ git/атрибуты

Ответ 5

У меня возникла такая же проблема после редактирования одного из моих файлов в новом редакторе. Оказывается, новый редактор использовал другую кодировку (Unicode), чем мой старый редактор (UTF-8). Поэтому я просто сказал своему новому редактору сохранить мои файлы с помощью UTF-8, а затем git снова показал мои изменения и не видел его как двоичный файл.

Я думаю, проблема была в том, что git не знает, как сравнивать файлы разных типов кодирования. Таким образом, тип кодировки, который вы используете, действительно не имеет значения, если он остается согласованным.

Я не тестировал его, но я уверен, что если бы я только что передал свой файл с новой кодировкой Юникода, то в следующий раз, когда я внес изменения в этот файл, он правильно отобразил изменения и не обнаружил его как бинарный, с тех пор он будет сравнивать два кодированных в Юникоде файлов, а не файл UTF-8 в файл Unicode.

Вы можете использовать приложение типа Notepad ++, чтобы легко видеть и изменять тип кодировки текстового файла; Откройте файл в Notepad ++ и используйте меню "Кодировка" на панели инструментов.

Ответ 6

У меня была такая же проблема. Я нашел поток при поиске решения в 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^@

Ответ 7

У нас был этот случай, когда файл .html рассматривался как двоичный, когда мы пытались внести в него изменения. Очень неудобно, чтобы не видеть различий. Честно говоря, я не проверял все решения здесь, но то, что сработало для нас, было следующим:

  • Убрал файл (фактически переместил его на рабочий стол) и совершил git deletion. Git говорит Deleted file with mode 100644 (Regular) Binary file differs
  • Повторно добавлен файл (фактически перемещен это с моего рабочего стола обратно в проект). Git говорит New file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletions Файл теперь добавляется как обычный текстовый файл

Отныне любые изменения, внесенные мной в файл, рассматриваются как обычный текстовый diff. Вы также можете раздавить эти коммиты (1, 2 и 3 - это фактическое изменение, которое вы делаете), но я предпочитаю видеть в будущем то, что я сделал. Скрипты 1 и 2 показывают двоичное изменение.

Ответ 8

Столкнулась с аналогичной проблемой в .java файлах. В моем случае проблема возникла из-за наличия специальных символов.

Просьба проверить наличие специальных символов в файлах.

Ответ 9

Per этот полезный ответ, вы можете напрямую спросить 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

Ответ 10

Я просто провел несколько часов, пройдя все в этом списке, пытаясь понять, почему один из тестовых проектов в моем решении не добавлял никаких тестов в проводник.

В моем случае оказалось, что каким-то образом (вероятно, из-за плохого слияния git) VS полностью потерял ссылку на проект. Он все еще строился, но я заметил, что он только построил зависимости.

Затем я заметил, что он не отображался в самом списке зависимостей, поэтому я удалил и повторно добавил тестовый проект, и все мои тесты появились наконец.