Почему Git рассматривает этот текстовый файл как двоичный файл? - PullRequest
127 голосов
/ 28 июля 2011

Интересно, почему 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

Разве это не текстовые файлы?

Я проверил атрибуты .gitatributes, и он пуст.Почему я получаю это сообщение?Я не могу получить различия, поскольку я использую больше

ДОБАВЛЕНО:

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

$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

Ответы [ 13 ]

68 голосов
/ 28 июля 2011

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

Осмотрев содержимое файла, он увидел вещи, которые не представлены в основных символах ascii. Будучи UTF16, я ожидаю, что в нем будут «забавные» символы, поэтому он думает, что он двоичный.

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

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

35 голосов
/ 24 июня 2014

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

19 голосов
/ 28 октября 2015

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

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

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

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

18 голосов
/ 05 сентября 2013

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

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

9 голосов
/ 16 января 2014

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

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

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

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

6 голосов
/ 24 сентября 2015

У меня была такая же проблема.Я нашел нить, когда я ищу решение в 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^@
3 голосов
/ 22 декабря 2017

За этот полезный ответ , вы можете напрямую спросить 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 голосов
/ 20 декабря 2016

У нас был случай, когда файл .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 покажет двоичное изменение.

1 голос
/ 07 июня 2018

У меня был случай, когда .gitignore содержал двойную последовательность \r (возврат каретки) по назначению.

Этот файл был идентифицирован как двоичный файл git. Помогло добавление файла .gitattributes.

# .gitattributes file
.gitignore diff
0 голосов
/ 11 апреля 2019

Это также вызвано (по крайней мере, в Windows) текстовыми файлами, которые имеют UTF-8 с кодировкой BOM . Изменение кодировки на обычную UTF-8 немедленно заставило Git увидеть файл как type = text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...