Группа ЛФ Эол в Git репозитория и рабочей копии



у меня есть репозиторий git, размещенный на github. Многие из файлов были изначально разработаны на Windows, и я не был слишком осторожен с окончаниями строк. Когда я выполнял начальную фиксацию, у меня также не было никакой конфигурации git для обеспечения правильных окончаний строк. В результате у меня есть несколько файлов с окончаниями строк CRLF в моем репозитории github.



Я сейчас разрабатываю частично на Linux, и я хотел бы очистить окончание строки. Как я могу гарантировать, что файлы хранится правильно с LF на github, и есть LF в моей рабочей копии?



Я создал содержащих text eol=LF; Это верно? С этим совершенным и толкнул, я могу просто rm мое локальное РЕПО и повторный клон из github, чтобы получить желаемый эффект?

711   3  

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, проверьте .gitattributes at ядро:

# 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

Читайте также:

Comments

    Ничего не найдено.