Git думает, что я переписываю один из моих файлов каждый раз, когда я делаю небольшое изменение
Вопрос
У меня есть файл 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 видит этот файл как бинарный или что-то в этом роде? Это проблема? Если это так, как я могу это исправить?
Решение 2
Чтобы исправить это, мне не нужно было менять какие-либо основные настройки git, так как генерируемые окончания строк по умолчанию были хороши, просто этот конкретный файл был искажен. Чтобы исправить это, я открыл vim и выполнил следующую команду
:%s/^M/\r/g
Обратите внимание, что для ввода " ^ M " вам нужно набрать ctrl-V, а затем ctrl-M.
Другие советы
Очевидно, что git не нравятся окончания строк в стиле Mac (только CR). Его алгоритм сравнения использует LF в качестве разделителя строк.
Исправьте в файлах окончания строк в стиле Windows (CR LF) или unix (только LF).
Установите core.autocrlf
и core.safecrlf
с помощью git-config
. Это заставит git автоматически преобразовывать окончания строк при переносе из / в хранилище объектов. Вам может потребоваться сделать коммит для сохранения " нового " окончания.
Судя по вставленному примеру, вы также можете страдать от "окончаний строк Mac в старом стиле". (спасибо ddaa и Charles Bailey для подсказки), которые являются только голыми CR
без каких-либо LF
, случай, не обработанный git. Если это так (проверьте с помощью шестнадцатеричного редактора), используйте такой инструмент, как перекодировать
чтобы перевести этот мусор в какой-то формат 21-го века, например, в правильные LF
-только строки Unix.
git diff -b
Игнорирует изменения конца строки при отображении различий.