(Примечание: я пытаюсь ответить на основной вопрос, который, похоже, на самом деле звучит так: Если проверка означает git checkout
, почему я получаю эти сообщения во время git add
?)
Документация по этому поводу немного небрежна, возможно, намеренно, потому что точно правильные детали несколько неясны. Чтобы хорошо понять это на концептуальном уровне, вы должны рассматривать модификацию конца строки как часть более общей фильтрации smudge и clean (поскольку именно так она реализована ).
В Git каждый файл, с которым вы можете работать в данный момент, существует одновременно в трех местах:
the HEAD commit the index the work-tree
--------------- --------- -------------
README.md README.md README.md
file.txt file.txt file.txt
Файлы можно копировать в разных направлениях, за исключением того, что все фиксации всегда доступны только для чтения. Таким образом, вы можете скопировать из фиксации HEAD в индекс или из индекса в рабочее дерево. Вы также можете скопировать из рабочего дерева в индекс.
(Вы также можете сделать новую фиксацию из индекса. При этом старая фиксация HEAD остается в покое, а новая фиксация становится фиксацией HEAD. Таким образом, после создания новой фиксации, фиксация HEAD и индекс совпадают. Это не потому, что мы изменили какую-либо фиксацию; мы не можем этого сделать. Это потому, что мы добавили новую фиксацию, сделанную из индекса, а затем перестали вызывать старый фиксирует HEAD и вместо этого вызывает новый HEAD.)
Обратите внимание, что индекс находится «на пути» между HEAD и рабочим деревом. Чтобы скопировать любой файл из HEAD в рабочее дерево, он должен сначала пройти через индекс. Чтобы сделать новую фиксацию из рабочего дерева, каждый новый файл должен пройти через индекс. Следовательно, переходы между индексом и рабочим деревом — это место, где происходят очистка и размазывание.
«Очистить» файл означает подготовить его к фиксации. Этот процесс очистки может, например, преобразовать окончания строк CRLF в окончания строк только LF. Или, используя фильтр ident
, вы можете отменить множество замен или написать свой собственный фильтр, чтобы делать практически все что угодно. Размазать файл означает подготовить его для редактирования и/или использования в рабочем дереве. Это может, например, преобразовать окончания строк только LF в окончания CRLF. Как и в случае с процессом очистки, вы можете использовать фильтр ident
или свой собственный фильтр-драйвер, чтобы делать все, что захотите. Git LFS использует эти драйверы для замены коротких ссылок и всего содержимого файла.
Следовательно, точный ответ заключается в том, что преобразования конца строки применяются во время тех процессов, которые копируют файлы в индекс или из него. Наиболее распространены эти два:
git add
копирует из рабочего дерева в индекс.
git checkout
извлекается в рабочее дерево либо из фиксации в индекс, а затем в рабочее дерево, либо прямо из индекса в рабочее дерево.
Любое из этих преобразований CRLF-to-LF или LF-to-CRLF происходит только в это время. Но в Git есть дополнительный код, который пытается интуитивно понять, приведут ли эти преобразования позже к изменению существующих зафиксированных данных, даже если они еще не были выполнены. Этот код выдаст предупреждающие сообщения, которые вы видите:
warning: LF will be replaced by CRLF ...
warning: CRLF will be replaced by LF ...
Эти предупреждения появляются, если вы включаете опцию «безопасный crlf». Поскольку они происходят из разных кодов, запускаемых в разное время, все может быть очень запутанным.
person
torek
schedule
11.10.2017
git checkout
. Когда вы делаетеgit clone
, он сначала копирует репозиторий (каталог .git), а затем проверяет соответствующую ветвь в вашем рабочем дереве. - person Mort   schedule 11.10.2017