Git - выводить изменения без модификации

Я только что клонировал свой репозиторий из моего репозитория Bitbucket, однако я получаю много файлов с изменениями на этапе фиксации.

Однако есть изменения, как в этом примере:

введите здесь описание изображения

Я скрыл имя БД и имя таблицы для конфиденциальности, но они одинаковы (без изменений) и одинаковы для всех файлов.

Я подумал, что это как-то связано с разрывами строк (CRLF) и выполнил это:

 git config --global core.autocrlf true

А потом:

git reset

Однако я все еще вижу изменения вывода, и количество файлов не уменьшилось.

Что может происходить?


person user1911    schedule 14.06.2021    source источник
comment
Все ли они содержат только пробельные изменения? Связаны ли изменения только с окончаниями строк или это нечто большее? У вас есть редактор, который может сделать что-то вроде удаления всех пробелов в трелинге?   -  person Mort    schedule 14.06.2021


Ответы (1)


Красное пятно в конце строки указывает на ненужное — то есть в глазах Git — пустое пространство. Будут ли определенные биты пробела ненужными, зависит от пользователя данных. Рассмотрим, например, [язык программирования Whitespace](https://en.wikipedia.org/wiki/Esoteric_programming_language#Whitespace: конечные пробелы здесь, безусловно, имеют значение. Но поскольку текст на вашем изображении представляет собой простой SQL, конечные пробелы здесь не имеют значения.

Это не обязательно CRLF. Предположим, например, что у нас есть следующие строки:

This is  
some text.

Теперь добавим букву Z в конец каждой строки. Удивление или нет, в зависимости от того, насколько внимательно вы посмотрели текст выше, заключается в том, что мы получаем это:

This is  Z
some text.Z

Если мы удалим ненужные пробелы после слова is, то получим:

This isZ
some text.Z

Если мы выполним удаление этих пробелов, Git покорно покажет разницу, потому что есть разница. Это может быть различие без различия, как в операторе SQL, или нет, как в языке пробелов. Git на самом деле не знает, поэтому он покажет изменение.

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

Мне интереснее вот это:

\ No newline at end of file

Строки в текстовом файле могут быть разделены разделителями строк или заканчиваться разделителями/разделителями строк. Что это значит? Давайте посмотрим на содержимое этого файла с двумя строками (после того, как мы удалим ненужные лишние пробелы). Он читает This isend-of-linesome text.end-of-line? Или это This isend-of-linesome text.? В первом случае у нас есть разделители строк: каждая строка заканчивается концом строки. В последнем случае у нас есть разделители строк: строки разделяются концом строки, но в файле нет последнего конца строки .

Если мы открыли файл в нашем редакторе, возможно, мы не сможем сказать. Можем ли сказать, зависит ли это от нашего редактора, и если да, то как. Однако очень часто, независимо от того, какой макет у файла — разделители или разделители, — он будет выглядеть абсолютно одинаково. Но это не так.

Команда git diff должна иметь возможность сообщать вам или, что более важно, сообщить Git, когда файл выглядит так. Таким образом, он использует этот \ No newline at end of file, чтобы сказать, что в файле отсутствует последний разделитель строки. Git, по сути, считает, что в файлах обычно используются разделители строк, а в этом один отсутствует.

Если у вас есть файл, который заканчивается без разделителя строки, и вы хотите добавить в него строку, вы должны необходимо добавить или изменить две строки в процессе: вы сначала добавьте терминатор к тому, что в конце файла отсутствует, затем вы добавляете еще одну строку с терминатором или без него. Если все строки заканчиваются терминатором, и вы хотите добавить одну строку, вам нужно добавить только одну строку. Так что, вероятно, вам следует избегать этой ситуации. В вашем редакторе может быть параметр, обеспечивающий, чтобы последняя строка текстового файла заканчивалась правильным разделителем строк.

После того, как вы позаботились об этом и проверили, добавили ли вы пустой текстовый пробел в конце строки, которая раньше была последней строкой файла, затем вы можете выяснить, есть ли у вас проблемы с CRLF. См. Почему мой файл .gitattributes не препятствует добавлению \rs при извлечении файлов в Windows?, Как нормализовать рабочие окончания строк дерева в Git? и многое другое (поиск CRLF, окончаний строк, gitattributes и т. д. в разделе git.)


1Я волшебным образом узнаю об этом, читая ваши мысли. ???? Нет, конечно, я на самом деле не знаю, чего вы ожидаете, но на практике никто не ожидает, что Git сделает это там, где Git это делает на самом деле.

person torek    schedule 14.06.2021