Я был укушен проблемой конца строки Windows / Linux с git. Похоже, через GitHub, MSysGit и другие источники, что лучшее решение - это настроить локальные репозитории на использование окончаний строк в стиле linux, но установить core.autocrlf
на true
. К сожалению, я не делал этого достаточно рано, поэтому теперь каждый раз, когда я нажимаю изменения, концы строк обшиваются.
Я думал, что нашел ответ здесь, но я не могу заставить его работать на меня. Мои знания командной строки Linux в лучшем случае ограничены, поэтому я даже не уверен, что строка «xargs fromdos» делает в своем скрипте. Я продолжаю получать сообщения о том, что такого файла или каталога не существует, и когда мне удается указать его на существующий каталог, он говорит мне, что у меня нет разрешений.
Я пробовал это с MSysGit на Windows и через терминал Mac OS X.
источник
Ответы:
В документации git для gitattributes теперь описан другой подход для «исправления» или нормализации всех концов строк в вашем проекте. Вот суть этого:
Это использует новый
--renormalize
флаг, добавленный в git v2.16.0, выпущенный в январе 2018. Для более старых версий git есть еще несколько шагов:источник
git reset
, пожалуйста?git status
является запускgit diff --ignore-space-at-eol
только для того, чтобы быть уверенным, что единственными изменениями, которые вы вносите, являются окончания строк.git reset
будет обнаружено никаких модификаций, и, следовательно, бесполезно.--renormalize
флагом добавленного в мерзавце v2.16.0 , который был выпущен в январе 2018 года--renormalize
флаг консолидирует процесс повторных обработки окончаний строк для каждого гусеничного файла в одну команду:git add --renormalize .
.Самый простой способ исправить это - сделать один коммит, который исправит все окончания строки. Предполагая, что у вас нет никаких измененных файлов, вы можете сделать это следующим образом.
источник
Моя процедура работы с окончаниями строк следующая (битва проверена на многих репозиториях):
При создании нового репо:
.gitattributes
в самый первый коммит вместе с другими типичными файлами, как.gitignore
иREADME.md
При работе с существующим репо:
.gitattributes
соответственноgit commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
(--no-verify
это пропустить предварительную фиксацию хуков)alias fixCRLF="..."
В
.gitattributes
Заявляю все текстовые файлы в явном виде как имеющие LF EOL , так как в целом для Windows инструмент совместим с LF , а не-Windows инструменты не совместим с CRLF (даже многие nodejs инструменты командной строки Предположим , LF и , следовательно , могут изменить EOL в файлах).Содержание
.gitattributes
Мой
.gitattributes
обычно выглядит так:Чтобы выяснить, какие отдельные расширения отслеживаются Git в текущем репо, посмотрите здесь
Проблемы после нормализации
Как только это будет сделано, есть еще одна распространенная оговорка.
Скажите, что вы
master
уже обновлены и нормализованы, а затем вы оформляете заказoutdated-branch
. Довольно часто сразу после проверки этой ветки git помечает многие файлы как измененные.Решение состоит в том, чтобы сделать фиктивный commit (
git add -A . && git commit -m 'fake commit'
) и затемgit rebase master
. После перебазировки фальшивый коммит должен исчезнуть.источник
2.7.0.windows.1
я использовал следующее:git rm --cached -r . && git reset --hard && git add . && git commit -m "Normalize EOL" -n
Объяснение:
git status --short
Здесь отображаются все строки, о которых git знает и не знает. Файлы, которые не находятся под контролем git, отмечены в начале строки знаком «?». Измененные файлы помечены знаком М.
grep "^ *M"
Это отфильтровывает только те файлы, которые были изменены.
awk '{print $2}'
Это показывает только имя файла без каких-либо маркеров.
xargs fromdos
Это берет имена файлов из предыдущей команды и запускает их через утилиту 'fromdos' для преобразования концов строк.
источник
dos2unix
вместоfromdos
.Вот как я исправил все окончания строк во всей истории, используя
git filter-branch
. Символ^M
должен быть введен с помощьюCTRL-V
+CTRL-M
. Я использовалdos2unix
для преобразования файлов, так как это автоматически пропускает двоичные файлы.источник
«| Xargs fromdos» считывает из стандартного ввода (файлы
find
находит) и использует его в качестве аргументов для командыfromdos
, которая преобразует окончания строки. (Является ли стандарт fromdos в этих средах? Я привык к dos2unix). Обратите внимание, что вы можете избежать использования xargs (особенно полезно, если у вас достаточно файлов, так что список аргументов слишком длинный для xargs):или
Я не совсем уверен насчет ваших сообщений об ошибках. Я успешно проверил этот метод. Какую программу продюсирует каждый? Для каких файлов / каталогов у вас нет прав? Тем не менее, вот попытка угадать, что это может быть:
Один из простых способов получить ошибку «file not found» для скрипта - использовать относительный путь - использовать абсолютный путь. Точно так же вы можете получить ошибку прав доступа, если вы не сделали исполняемый скрипт (chmod + x).
Добавьте комментарии, и я постараюсь помочь вам разобраться!
источник
ладно ... под cygwin у нас нет легкодоступного fromdos, и этот awk substeb взрывается у вас на лице, если у вас есть пробелы в путях к измененным файлам (которые у нас были), поэтому мне пришлось сделать это несколько иначе:
спасибо @lloyd для большей части этого решения
источник
Выполните следующие действия, если ни один из других ответов не работает для вас:
git config --global core.autocrlf true
; если вы на Unix, сделайтеgit config core.autocrlf input
git rm --cached -r .
.gitattributes
git add -A
git reset --hard
Тогда ваш местный житель должен быть чистым сейчас.
источник
.gitattributes
файла является решением проблемы с окончаниями строк?