Git говорит, что файл изменен, хотя это не так - PullRequest
0 голосов
/ 12 декабря 2018

Итак, я в своей ветке internal_env_board2 и пытаюсь перейти на ветку battery_board .Однако, когда я пытаюсь сделать это, я получаю сообщение об ошибке:

$ git checkout battery_board
error: Your local changes to the following files would be overwritten by checkout:
        internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx
Please commit your changes or stash them before you switch branches.
Aborting

Я очень раздражен, потому что я знаю, что я не изменял этот файл .xlsx.Единственное, что я сделал, - это открыл файл Excel, просмотр его содержимого и снова закрыл его.Git почему-то считает, что в этом файле есть изменения.Я попытался использовать git diff, чтобы найти различия между рабочей копией дерева и самой последней принятой копией, и получил следующее:

$ git diff HEAD internal_env_board_with_LCD_BOM.xlsx
diff --git a/internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx b/internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx
index 0fb3369..10c945e 100644
Binary files a/internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx and b/internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx differ

У меня много проблем с пониманием вывода этогокоманда сравненияЭто просто говорит мне, что они отличаются, но не как.

Итак, я думаю, у меня два вопроса:

1.Почему git считает, что я изменил файл только потому, что открыл его?

2.Как мне прочитать вывод команды git diff HEAD ?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы не можете винить Git, если Excel (в некоторых сценариях) изменяет файл каждый раз, когда он его открывает.

Кроме того, вы не можете ожидать, что Git сообщит об изменениях для такого файла в значимойпуть: diff дает полезную информацию для текстовых файлов, .xlsx - двоичные файлы.

Посмотрите, есть ли ответы здесь и здесь и здесь помощь.

Вы также можете попытаться подтвердить, что действительно ваш Excel изменяет (отметку времени и / или содержимое) каждого .xlsx при открытом открытии - я не испытываю этого.И, в крайнем случае, вы можете попытаться открыть его каким-нибудь средством просмотра XLSX или в LibreOffice Calc.

0 голосов
/ 12 декабря 2018

ОБНОВЛЕНИЕ для последующего вопроса в комментариях


  1. Что ж, вы, вероятно, раздражены не тем инструментом.git считает, что файл был изменен, если информация о файле stat изменилась - то есть обычно его размер или отметка времени "последнего изменения" сейчас отличаются от того, что было при извлечении.Почему эти данные изменились, нам будет сложно сказать.Я могу сказать, что некоторые (если не все) версии Excel довольно агрессивны в определении «изменения».Я видел перемещение активной ячейки, рассматриваемое как изменение, и если такая вещь была сохранена, то файл будет другим, даже если его полезное содержимое не будет.

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

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

Если вы можете найтиинструмент, который более полно сравнивает файлы Excel, вы можете указать git использовать его при сравнении версий этого файла (через gitattributes);У меня нет рекомендации по такому инструменту.


Есть ли способ поднести пистолет к Git и сказать: "Эй, я знаю, что есть разница, но откажитесь от неепотому что мне все равно, и я пойду в новую ветку "?

Если изменение не было add ed (т. Е. status показывает его как непостановленное изменение), вы можете

git checkout -- path/to/the/file.xslx

Если изменение было added (т. е. status показывает его как измененную стадию для фиксации), вы можете

git reset -- path/to/the/file.xslx

, и тогда он будет неустановленным и может обрабатываться, как указано выше.

Для дальнейшего использования,вывод status говорит вам, какие команды использовать для отмены изменений.

...