Git думает, что я переписываю один из моих файлов каждый раз, когда я делаю небольшое изменение - PullRequest
9 голосов
/ 28 октября 2008

У меня есть файл Java среднего размера. Каждый раз, когда я вносил изменения в один из моих файлов, BuildTable.java, Git сообщает об этом как о существенном изменении, даже если это всего лишь строка или две. BuildTable.java содержит около 200 строк, и изменение в этом коммите изменило только одну строку.

git-diff выводит это:

--- a/src/BuildTable.java
+++ b/src/BuildTable.java
@@ -1 +1 @@
-import java.io.FileNotFoundException;^Mimport java.io.FileReader;^Mimport java.io.InputStreamReader;^Mimport java.io.PushbackReader;^Mimport java.util.ArrayList;^Mimport
\ No newline at end of file
+import java.io.FileNotFoundException;^Mimport java.io.FileReader;^Mimport java.io.InputStreamReader;^Mimport java.io.PushbackReader;^Mimport java.util.ArrayList;^Mimport
\ No newline at end of file

После выполнения git-commit -a

Created commit fe43985: better error notifications
 3 files changed, 54 insertions(+), 50 deletions(-)
 rewrite src/BuildTable.java (78%)

Git видит этот файл как бинарный или что-то в этом роде? Это проблема? Если это так, как я могу это исправить?

Ответы [ 4 ]

26 голосов
/ 28 октября 2008

Очевидно, что git не нравятся окончания строк в стиле Mac (только CR). Его алгоритм сравнения использует LF в качестве разделителя строк.

Исправьте ваши файлы так, чтобы они заканчивались символами окон в стиле Windows (CR LF) или unix (только LF).

19 голосов
/ 30 октября 2008

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

:%s/^M/\r/g

Обратите внимание, что для ввода "^ M" необходимо набрать ctrl-V, а затем ctrl-M.

4 голосов
/ 28 октября 2008

Набор core.autocrlf и core.safecrlf с git-config. Это заставит git автоматически преобразовывать окончания строк при переносе из / в хранилище объектов. Вам может потребоваться сделать коммит для сохранения «новых» окончаний.

Судя по вашему вставленному примеру, вы также можете страдать от "оконечных линий Mac в старом стиле" (спасибо ddaa и Charles Bailey за подсказку), которые являются только голые CR с без LF, случай, не обработанный git. Если это так (проверьте с помощью шестнадцатеричного редактора), используйте инструмент, подобный recode, чтобы перевести этот мусор в какой-то формат 21-го века, например, в правильные LF -только конца строки Unix.

1 голос
/ 29 ноября 2009
git diff -b

Игнорирует изменения конца строки при отображении различий.

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