У меня есть git-репозиторий, размещенный на github. Многие из файлов были изначально разработаны для Windows, и я не слишком заботился об окончании строк. Когда я выполнил начальную фиксацию, у меня также не было никакой конфигурации git для обеспечения правильного окончания строк. В результате в моем репозитории github есть несколько файлов с окончаниями строк CRLF.
Сейчас я частично занимаюсь разработкой для Linux, и я хотел бы очистить окончание строк. Как я могу убедиться, что файлы правильно хранятся с помощью LF на github и имеют LF в моей рабочей копии?
Я создал .gitattributes
файл, содержащий text eol=LF
; это правильно? С этим совершенным и подталкиваемым, могу ли я просто сделать rm
локальное репо и повторно клонировать его с github, чтобы получить желаемый эффект?
Ответы:
Без некоторой информации о том, какие файлы находятся в вашем хранилище (чистый исходный код, изображения, исполняемые файлы, ...), довольно сложно ответить на вопрос :)
Кроме того, я буду считать, что вы по умолчанию хотите использовать LF в качестве окончания строк в вашем рабочем каталоге, потому что вы хотите убедиться, что текстовые файлы имеют окончания LF в вашем репозитории .git, если вы работаете в Windows или Linux , Действительно лучше, чем потом сожалеть ....
Тем не менее, есть лучшая альтернатива: используйте концы строк LF в вашем рабочем каталоге Linux, окончания строк CRLF в вашем рабочем каталоге Windows и окончания строк LF в вашем хранилище.
Поскольку вы частично работаете над Linux и Windows, убедитесь, что
core.eol
установленоnative
иcore.autocrlf
установлено наtrue
.Затем замените содержимое вашего
.gitattributes
файла следующимЭто позволит Git обрабатывать автоматическое преобразование концов строк для вас при фиксации и проверке. Двоичные файлы не будут изменены, файлы, определенные как текстовые файлы, будут видеть окончание строк, преобразованное на лету.
Однако, поскольку вы знаете содержимое своего хранилища, вы можете помочь Git и помочь ему обнаружить текстовые файлы из двоичных файлов.
Если вы работаете над проектом обработки изображений на основе C, замените содержимое вашего
.gitattributes
файла следующимЭто гарантирует, что файлы с расширением c, h или txt будут храниться с LF-окончаниями в вашем репо и будут иметь собственные окончания в рабочем каталоге. Файлы JPEG не будут затронуты. Все остальные получат выгоду от той же автоматической фильтрации, как показано выше.
Чтобы получить более глубокое понимание внутренних деталей всего этого, я бы посоветовал вам погрузиться в этот очень хороший пост « Имей в виду конец своей линии» от Гитуббера Тима Клема.
В качестве примера из реальной жизни вы также можете посмотреть этот коммит, где
.gitattributes
демонстрируются эти изменения в файле.ОБНОВЛЕНИЕ к ответу, учитывая следующий комментарий
Имеет смысл. Спасибо за разъяснения. В этом конкретном контексте одного
.gitattributes
файла будет недостаточно.Запустите следующие команды для вашего хранилища
Поскольку ваш репозиторий является общим для вашей среды Linux и Windows, это обновит локальный файл конфигурации для обеих сред.
core.eol
удостоверится, что текстовые файлы имеют LF окончания строки при оформлении заказаcore.autocrlf
гарантирует, что потенциальные CRLF в текстовых файлах (например, в результате операции копирования / вставки) будут преобразованы в LF в вашем хранилище.При желании, вы можете помочь Git различать , что это текстовый файл, создав
.gitattributes
файл , содержащий нечто похожее на следующее:Если вы решили создать
.gitattributes
файл, передайте его .Наконец, убедитесь, что
git status
упоминается «ничего не совершать (очистка рабочего каталога)» , затем выполните следующую операциюЭто будет воссоздавать ваши файлы в вашем рабочем каталоге, принимая во внимание ваши изменения конфигурации и
.gitattributes
файл и заменяя любые потенциальные пропущенные CRLF в ваших текстовых файлах.Как только это будет сделано, каждый текстовый файл в вашем рабочем каталоге будет иметь LF-окончания и
git status
все равно должен будет считать рабочий каталог чистым.источник
vi
он менее доволен CRLF. Должен ли я просто хочу , чтобы изменить его так , чтоcore.autocrlf
естьfalse
(илиinput
)?git checkout-index --force --all
может работать лучше. Второй пункт выглядит немного не по теме в отношении исходного вопроса. Как насчет того, чтобы задать специальный вопрос?text
иeol=lf
достичь того же результата, который описан в вашем ответе черезcore.eol
иcore.autocrlf
?git checkout-index --force --all
ничего не делает для меня Что работает, так это список команд в инструкциях GitHub для решения этой проблемы.Начиная с git 2.10 (выпущен 2016-09-03), нет необходимости перечислять каждый текстовый файл отдельно. Git 2.10 исправил поведение text = auto вместе с eol = lf . Источник .
.gitattributes
файл в корне вашего репозитория git:Добавьте и передайте это.
После этого вы можете выполнить следующие шаги и все файлы теперь нормализованы:
Источник: Ответ от Кенорб .
источник
Чтобы форсировать LF-окончания строк для всех текстовых файлов, вы можете создать
.gitattributes
файл на верхнем уровне вашего хранилища со следующими строками (изменить по желанию):что гарантирует, что все файлы, которые Git считает текстовыми, имеют в конце
LF
строки нормализованное ( ) окончание строки (обычно этоcore.eol
элементы управления конфигурацией, которые у вас есть по умолчанию).Основываясь на новых настройках атрибутов, любые текстовые файлы, содержащие CRLF, должны быть нормализованы Git. Если это не произойдет автоматически, вы можете обновить хранилище вручную после изменения концов строк, чтобы можно было повторно отсканировать и зафиксировать рабочий каталог, выполнив следующие действия (при наличии чистого рабочего каталога):
или согласно документации GitHub :
Смотрите также: @Charles Bailey post .
Кроме того, если вы хотите исключить какие-либо файлы, которые не рассматриваются как текст, отмените их атрибут текста, например
Или отметьте это явно как двоичный файл:
Для того, чтобы увидеть некоторые более продвинутый файл мерзавец нормализации, проверьте
.gitattributes
в ядре Drupal :Смотрите также:
источник
text=auto
вводит в заблуждение. Вы не можете использоватьtext=auto
иeol
вместе. Настройкаeol
отключает автоматическое обнаружение текстовых файлов. Вот почему вы должны указать все эти типы файлов. Если быauto
было включено, вам не нужно все это. 2. Вам не нужноtext
иeol=lf
.eol=lf
эффективно устанавливаетtext
.* text=auto eol=lf
первыйtext=auto
отменяетсяeol=lf
. Где вы нашли эту функцию? Вот мой источник: stackoverflow.com/questions/29435156/…* text=auto eol=lf
из примера, поскольку оно было удалено и из Drupal. Также рассмотрите возможность удаления комментариев.