Группа ЛФ Эол в Git репозитория и рабочей копии
у меня есть репозиторий git, размещенный на github. Многие из файлов были изначально разработаны на Windows, и я не был слишком осторожен с окончаниями строк. Когда я выполнял начальную фиксацию, у меня также не было никакой конфигурации git для обеспечения правильных окончаний строк. В результате у меня есть несколько файлов с окончаниями строк CRLF в моем репозитории github.
Я сейчас разрабатываю частично на Linux, и я хотел бы очистить окончание строки. Как я могу гарантировать, что файлы хранится правильно с LF на github, и есть LF в моей рабочей копии?
Я создал содержащих text eol=LF; Это верно? С этим совершенным и толкнул, я могу просто rm мое локальное РЕПО и повторный клон из github, чтобы получить желаемый эффект?
3 ответов:
без небольшой информации о том, какие файлы находятся в вашем репозитории (чистый исходный код, изображения, исполняемые файлы,...), это немного трудно ответить на вопрос :)
кроме того, я буду считать, что вы готовы по умолчанию использовать LF в качестве окончаний строк в своем рабочем каталоге, потому что вы хотите убедиться, что текстовые файлы имеют окончания строк LF в вашем .репозиторий git работает ли вы на Windows или Linux. Действительно лучше перестраховаться....
тем не менее, есть лучшая альтернатива: выгода от НЧ окончаний строк в вашу директорию в Linux, эти символы не экранируются символы конца строки в Windows директорию и НЧ окончаний строк в ваше хранилище.
как вы частично работаете на Linux и Windows, убедитесь, что
core.eolустановлено значениеnativeиcore.autocrlfустановлено значениеtrue.затем замените содержимое вашего
.gitattributesфайл со следующим* text=autoэто позволит Git обрабатывать преобразование автоматических окончаний строк для вас, при фиксации и проверки. Двоичные файлы не будут изменены, файлы, обнаруженные как текстовые файлы, будут видеть окончания строк, преобразованные на лету.
однако, как вы знаете содержание вашего репозитория, вы можете дать Git руку и помочь ему обнаружить текстовые файлы из двоичных файлов.
если вы работаете над проектом обработки изображений на основе C, замените содержимое вашего
.gitattributesфайл со следующим* text=auto *.txt text *.c text *.h text *.jpg binaryэто позволит убедиться, что файлы с расширением c, h или txt будет храниться с окончаниями строк LF в вашем РЕПО и будет иметь собственные окончания строк в рабочем каталоге. Файлы Jpeg не будут затронуты. Все остальные будут пользоваться той же автоматической фильтрацией, что и выше.
чтобы получить более глубокое понимание внутренних деталей всего этого, я бы предложил вам погрузиться в этот очень хороший пост "запомни конец своей линии" от Тима Клема, Githubber.
как реальный мир например, вы также можете заглянуть в это commit где эти изменения демонстрируются.
обновить ответ с учетом следующего комментария
я на самом деле не хочу CRLF в моих каталогах Windows, потому что моя среда Linux на самом деле является VirtualBox, разделяющим каталог Windows
имеет смысл. Спасибо за разъяснение. В этом конкретный контекст, сам по себе не будет достаточно.
выполните следующие команды для вашего репозитория
$ git config core.eol lf $ git config core.autocrlf inputпоскольку ваш репозиторий является общим для вашей среды Linux и Windows, это обновит локальный файл конфигурации для обеих сред.
core.eolубедитесь, что текстовые файлы имеют LF-окончания строк при выписке.core.autocrlfгарантирует потенциал CRLF в текстовых файлах (например, в результате операции копирования / вставки) будет преобразовано в LF в вашем репозитории.опционально, вы можете помочь Git различать, что и текстовый файл путем создания
.gitattributesфайл, содержащий что-то похожее на следующее:# Autodetect text files * text=auto # ...Unless the name matches the following # overriding patterns # Definitively text files *.txt text *.c text *.h text # Ensure those won't be messed up with *.jpg binary *.data binaryесли вы решили создать , совершил его.
и, наконец, обеспечить
git statusупоминает "ничего фиксации (рабочий каталог чистый)", затем выполните следующую операцию$ git checkout-index --force --allэтот будет воссоздать ваши файлы в вашем рабочем каталоге, с учетом ваших изменений конфигурации и
.gitattributesфайл и замена любого потенциального упущенного CRLF в ваших текстовых файлах.как только это будет сделано, каждый текстовый файл в вашем рабочем каталоге будет иметь LF-окончания строк и
git statusвсе равно следует считать workdir чистым.
начиная с git 2.10, нет необходимости перечислять каждый текстовый файл отдельно. ГИТ 2.10 исправлено поведение text=auto вместе с eol=lf. источник.
.gitattributesфайл в корне вашего репозитория git:* text=auto eol=lfдобавить и зафиксировать его.
после этого вы можете выполнить следующие шаги, и все файлы теперь нормализованы:
git rm --cached -r . # Remove every file from git's index. git reset --hard # Rewrite git's index to pick up all the new line endings.источник: ответ kenorb.
чтобы принудительно завершить строку LF для всех текстовых файлов, вы можете создать
.gitattributesфайл в верхнем уровне вашего репозитория со следующими строками (изменить по желанию):# Ensure all C and PHP files use LF. *.c eol=lf *.php eol=lfчто гарантирует нормализацию всех файлов, которые Git считает текстовыми файлами (
LF) окончания строк в репозитории (обычноcore.eolэлементы управления конфигурацией, которые у вас есть по умолчанию).на основе новых настроек атрибутов, любые текстовые файлы, содержащие CRLFs должны быть нормализованы с помощью Git. Если это не произойдет автоматически, вы можете обновить репозиторий вручную после изменения окончаний строк, чтобы вы могли повторно сканировать и фиксировать рабочий каталог следующими шагами (учитывая чистый рабочий каталог):
$ echo "* text=auto" >> .gitattributes $ rm .git/index # Remove the index to force Git to $ git reset # re-scan the working directory $ git status # Show files that will be normalized $ git add -u $ git add .gitattributes $ git commit -m "Introduce end-of-line normalization"или GitHub docs:
git add . -u git commit -m "Saving files before refreshing line endings" git rm --cached -r . # Remove every file from Git's index. git reset --hard # Rewrite the Git index to pick up all the new line endings. git add . # Add all your changed files back, and prepare them for a commit. git commit -m "Normalize all the line endings" # Commit the changes to your repository.Читайте также: @Charles Bailey post.
кроме того, если вы хотите исключить любые файлы, которые не обрабатываются как текст, снимите их текстовый атрибут, например
manual.pdf -textили пометить его явно как двоичные:
# Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary
чтобы увидеть более продвинутый файл нормализации git, проверьте
.gitattributesat ядро:# Drupal git normalization # @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html # @see https://www.drupal.org/node/1542048 # Normally these settings would be done with macro attributes for improved # readability and easier maintenance. However macros can only be defined at the # repository root directory. Drupal avoids making any assumptions about where it # is installed. # Define text file attributes. # - Treat them as text. # - Ensure no CRLF line-endings, neither on checkout nor on checkin. # - Detect whitespace errors. # - Exposed by default in `git diff --color` on the CLI. # - Validate with `git diff --check`. # - Deny applying with `git apply --whitespace=error-all`. # - Fix automatically with `git apply --whitespace=fix`. *.config text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.css text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.dist text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.engine text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.html text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html *.inc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.js text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.json text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.lock text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.map text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.md text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.module text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.php text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.po text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.script text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.sh text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.sql text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.svg text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.theme text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.twig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.txt text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.xml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 # Define binary file attributes. # - Do not treat them as text. # - Include binary diff in patches instead of "binary files differ." *.eot -text diff *.exe -text diff *.gif -text diff *.gz -text diff *.ico -text diff *.jpeg -text diff *.jpg -text diff *.otf -text diff *.phar -text diff *.png -text diff *.svgz -text diff *.ttf -text diff *.woff -text diff *.woff2 -text diff
Читайте также:
- работа с окончаниями строк на GitHub
- при использовании vagrant:окна кода crlf на вопросы, Unix и ЖФ
Comments