Я использую git с моей командой и хотел бы удалить изменения пробелов из моих различий, журналов, слияний и т. Д. Я предполагаю, что самый простой способ сделать это - git автоматически удалить конечные пробелы (и другие ошибки пробелов) ) из всех коммитов по мере их применения.
Я попытался добавить следующее к ~/.gitconfig
файлу, но он ничего не делает, когда я фиксирую. Может быть, он предназначен для чего-то другого. Какое решение?
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
Я использую ruby на тот случай, если у кого-нибудь есть какие-то конкретные идеи. Следующим шагом будет автоматическое форматирование кода перед фиксацией, но это сложная проблема, которая не вызывает больших проблем.
git
whitespace
githooks
mloughran
источник
источник
Ответы:
Эти настройки (
core.whitespace
иapply.whitespace
) предназначены не для удаления конечных пробелов, а для:core.whitespace
: обнаружить их и вызвать ошибкиapply.whitespace
: и лишить их, но только во время патча, а не "всегда автоматически"Я считаю, что
git hook pre-commit
это сделало бы лучшую работу для этого (в том числе удаление конечных пробелов)Обратите внимание, что в любой момент вы можете не запускать
pre-commit
хук:git commit --no-verify .
cd .git/hooks/ ; chmod -x pre-commit
Предупреждение: по умолчанию,
pre-commit
скрипт (как этот ), имеет не функцию «удаления висячего», а функцию «предупреждения», такую как:Однако вы можете создать лучший
pre-commit
хук , особенно если учесть, что:Например, Олдман предлагает в другой ответ на
pre-commit
крючок , который детектирует и удалить пробелы.Так как этот хук получает имя файла каждого файла, я бы рекомендовал быть осторожным с определенным типом файлов: вы не хотите удалять конечные пробелы в
.md
(уценке) файлах!источник
apply.whitespace
, обманув git, чтобы он рассматривал изменения рабочей копии как патч. Смотрите мой ответ ниже ..editorconfig
файлов есть определенное правило для этого.<br>
: github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…core.whitespace
вtrailing-space
withgit config
не вызывает ошибку приgit
фиксации в 2.5.0.Вы можете обмануть Git, чтобы исправить пробелы для вас, обманув Git, рассматривая ваши изменения как патч. В отличие от решений «pre-commit hook», эти решения добавляют в Git команды исправления пробелов.
Да, это хаки.
Надежные решения
Следующие псевдонимы Git взяты из моего
~/.gitconfig
.Под «устойчивым» я подразумеваю, что эти псевдонимы работают без ошибок, делая правильные вещи, независимо от того, являются ли дерево или индекс грязными. Тем не менее, они не работают, если интерактив
git rebase -i
уже выполняется; см. мои~/.gitconfig
дополнительные проверки, если вам небезразличен этот угловой случай, гдеgit add -e
описанный в конце прием должен работать.Если вы хотите запустить их непосредственно в оболочке, не создавая псевдоним Git, просто скопируйте и вставьте все в двойные кавычки (при условии, что ваша оболочка похожа на Bash).
Исправить индекс, но не дерево
Следующий
fixws
псевдоним Git исправляет все пробельные ошибки в индексе, если таковые имеются, но не затрагивает дерево:Идея состоит в том, чтобы запускаться
git fixws
раньше,git commit
если у вас есть ошибки пробела в индексе.Исправить индекс и дерево
Следующий
fixws-global-tree-and-index
псевдоним Git исправляет все ошибки пробелов в индексе и дереве, если они есть:Чтобы также исправить пробелы в неверсионных файлах, выполните
Простые, но не надежные решения
Эти версии легче копировать и вставлять, но они не делают правильных вещей, если их побочные условия не выполняются.
Исправьте поддерево с корнем в текущем каталоге (но сбрасывает индекс, если он не пустой)
Использование
git add -e
для «редактирования» патчей с помощью редактора идентичности:
:Исправить и сохранить индекс (но не работает, если дерево грязное или индекс пустой)
Исправьте дерево и индекс (но сбрасывает индекс, если он не пустой)
Объяснение
export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
уловкиПрежде чем я узнал об
git rebase --whitespace=fix
уловке из этого ответа, я использовал более сложнуюgit add
уловку везде.Если мы сделали это вручную:
Установите
apply.whitespace
вfix
(вы должны сделать это только один раз):Это говорит Git исправлять пробелы в патчах .
Убедите Git рассматривать ваши изменения как патч :
Нажмите a+, enterчтобы выбрать все изменения для каждого файла. Вы получите предупреждение о том, что Git исправляет ваши пробельные ошибки.
(
git -c color.ui=auto diff
в этот момент обнаруживается, что ваши неиндексированные изменения являются именно ошибками пробелов).Удалите ошибки пробелов из вашей рабочей копии:
Верните ваши изменения (если вы не готовы их зафиксировать):
В
GIT_EDITOR=:
средстве для использования в:
качестве редактора, и как команда:
является тождественным.источник
set VISUAL= && git add -ue . && git checkout .
Обратите внимание на '.
', используемый сgit add
: это из-за git1.8.3git commit
неправильного редактора? Я оборачиваюVISUAL=
часть в подоболочку в моей версии Unix выше, чтобы избежать этого, но я не знаю, есть ли в DOS подоболочки.core.editor
установили, то экспорт неVISUAL
имеет никакого эффекта, потому что параметр конфигурации имеет приоритет поman git-var
. Чтобы переопределить это, вам нужно экспортироватьGIT_EDITOR=:
вместо этого.fixws
на провал быстро, если вы уже находитесь в интерактивном ребазинге, так как иначе он умрет наgit rebase --whitespace=fix
линии и оставит вас в странном состоянии. Я позаимствовал этот вопрос и просто добавил дополнительный случай перед тем, как:fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
Я нашел git pre-commit hook, который удаляет завершающие пробелы .
источник
sed
вызов (sed -r 's/:[0-9]+:.*//'
) можно заменить наcut -f1 -d:
. Это должно работать одинаково на платформах Linux и BSD.cut
не так безопасно, как второеsed
: вырезать не удастся в (крайне маловероятном) случае имен файлов, содержащих «:». Вы можете использовать,awk 'NF>2{NF-=2}1'
чтобы быть в безопасностиcore.autocrlf=true
, вы можете добавитьdos2unix -D "$FILE"
внутри цикла for, после sed. В противном случае он изменит все CRLF на LF, выдав только sed.git add
внутри коммита хук кажется мне довольно злым. Что делать, если вы делаете частичную подготовку / фиксацию файла? Вы же не хотите, чтобы весь файл был передан вам за спину?В Mac OS (или, скорее всего, в любом BSD) параметры команды sed должны немного отличаться. Попробуй это:
Сохраните этот файл как
.git/hooks/pre-commit
- или найдите тот, который уже там, и вставьте нижний блок где-нибудь внутри него. И помните,chmod a+x
это тоже.Или для глобального использования (через Git commit hooks - глобальные настройки ) вы можете поместить его
$GIT_PREFIX/git-core/templates/hooks
(где GIT_PREFIX - / usr или / usr / local или / usr / share или / opt / local / share) и запуститьgit init
внутри существующих репозиториев.По словам
git help init
:источник
git hash-object -w
иgit update-index
(повторно) вставить зараженный файл непосредственно в индекс. Кто-то очень смелый.Я бы предпочел оставить это задание вашему любимому редактору.
Просто установите команду для удаления завершающих пробелов при сохранении.
источник
(add-hook 'before-save-hook 'delete-trailing-whitespace)
в свой.emacs
файл. Трюки с пробелами в EmacsИспользование атрибутов git и настройка фильтров с помощью git config
Хорошо, это новый подход к решению этой проблемы ... Мой подход состоит в том, чтобы не использовать какие-либо хуки, а использовать фильтры и атрибуты git. Это позволяет вам настроить на каждом компьютере, на котором вы разрабатываете, набор фильтров, которые уберут лишние пробелы и лишние пустые строки в конце файлов перед их фиксацией. Затем настройте файл .gitattributes, в котором указано, к каким типам файлов должен применяться фильтр. Фильтры имеют две фазы,
clean
которые применяются при добавлении файлов в индекс, иsmudge
которые применяются при добавлении их в рабочий каталог.Скажите вашему git искать глобальный файл атрибутов
Сначала скажите вашей глобальной конфигурации использовать файл глобальных атрибутов:
Создать глобальные фильтры
Теперь создайте фильтр:
Добавьте магию сценариев sed
Наконец, положить
fixup-eol-eof
скрипт где-нибудь на вашем пути и сделайте его исполняемым. Сценарий использует sed для редактирования на лету (удаление пробелов и пробелов в конце строк и лишних пустых строк в конце файла)fixup-eol-eof должен выглядеть так:
моя суть этого
Сообщите git, к каким типам файлов применять ваш вновь созданный фильтр
Наконец, создайте или откройте ~ / .gitattributes_global в вашем любимом редакторе и добавьте такие строки, как:
Поэтому, если мы хотим исправить проблему пробелов, для всех наших исходных файлов c мы добавим строку, которая выглядит следующим образом:
Обсуждение фильтра
Фильтр имеет две фазы: чистая фаза, которая применяется, когда вещи добавляются в индекс или регистрируются, и фаза размазывания, когда git помещает вещи в ваш рабочий каталог. Здесь наше пятно просто запускает содержимое через
cat
команду, которая должна оставить их без изменений, за исключением возможного добавления завершающего символа новой строки, если в конце файла его не было. Команда clean - это фильтрация пробелов, которую я собрал из заметок на http://sed.sourceforge.net/sed1line.txt . Кажется, что это должно быть помещено в сценарий оболочки, я не мог понять, как внедрить команду sed, в том числе очистку лишних лишних строк в конце файла непосредственно в файле git-config. (Вы МОЖЕТЕизбавиться от конечных пробелов, однако, без необходимости отдельного сценария sed, просто установите наfilter.fix-eol-eof
что-то вроде,sed 's/[ \t]*$//' %f
где\t
является реальной вкладкой, нажав tab.)Require = true вызывает ошибку, если что-то идет не так, чтобы вы не попадали в неприятности.
Пожалуйста, прости меня, если мой язык относительно мерзости неточен. Я думаю, что я достаточно хорошо понимаю концепции, но все еще изучаю терминологию.
источник
.git
папке, а не глобально, что может иметь больше смысла.Я написал этот хук перед фиксацией, который удаляет только пробел из строк, которые вы изменили / добавили, поскольку предыдущие предложения, как правило, создают нечитаемые коммиты, если целевые файлы имеют слишком много пробела.
источник
Пожалуйста, попробуйте мой предварительный коммит хуки , он может автоматически определить конечный пробел и удалить его . Спасибо!
это может работать под
GitBash(windows), Mac OS X and Linux
!Снимок:
источник
git commit -no-verify
, какие-нибудь предложения?.md
файл, а не удалять пробелы, вместо того, чтобы просить конечного пользователя добавить--no-verify
опцию вgit commit
.+
или-
Вот версия, совместимая с Ubuntu + Mac OS X:
Радоваться, веселиться
источник
Думал об этом сегодня. Это все, что я сделал для проекта Java:
источник
Для пользователей Sublime Text .
Правильно настройте следующее в настройках пользователя .
"trim_trailing_white_space_on_save": true
источник
*.md
(уценка) файлы, которые используют "" (конечные двойные пробелы) для пометки простых<br />
, и эта настройка, кажется, применяется ко всем файлам, включая те, которые я не хочу удалять конечные пробелы.цикл for для файлов использует переменную оболочки $ IFS. в данном сценарии имена файлов с символом в них, который также находится в переменной $ IFS, будут рассматриваться как два разных файла в цикле for. Этот скрипт исправляет это: модификатор многострочного режима, как указано в sed-manual, по-видимому, не работает по умолчанию на моем компьютере с Ubuntu, поэтому я искал другую реализацию и нашел это с помощью итеративной метки, по сути, он только начнет замену на Последняя строка файла, если я правильно понял.
[1] шаблон sed-subition: как заменить символ новой строки (\ n) с помощью sed? ,
источник
Это не удаляет пробелы автоматически перед фиксацией, но это довольно легко сделать. Я поместил следующий скрипт на Perl в файл с именем git-wsf (git whitespace fix) в директорию в $ PATH, чтобы я мог:
мерзавец wsf | ш
и он удаляет все пробелы только из строк файлов, которые git сообщает как diff.
источник
Немного поздно, но так как это может помочь кому-то там, здесь идет.
Откройте файл в VIM. Чтобы заменить вкладки пробелами, введите в командной строке vim следующую команду
Чтобы избавиться от других конечных пробелов
Это в значительной степени сделало это для меня. Это утомительно, если у вас есть много файлов для редактирования. Но я обнаружил, что это проще, чем предварительная фиксация и работа с несколькими редакторами.
источник
sed -i 's|\t| |g' filenames
(пробелы в позиции замены). Обратите внимание, что вы можете использовать find, чтобы получить ваши имена файлов. Если вы не задумывались о том, как получить эту резервную копию, я обычно просто фиксирую все и затем «отменяю» фиксацию с программным сбросом обратно туда, где я нахожусь; иногда я добавляю все в дерево, но не фиксирую, а иногда я использую stash / apply (не pop!). Если я испытываю беспокойство, перед тем как вмешаться, я перевожу все свое дерево в безопасное место ...Чтобы удалить конечные пробелы в конце строки в файле, используйте
ed
:источник
Это, вероятно, не решит вашу проблему напрямую, но вы можете установить ее с помощью git-config в вашем реальном пространстве проекта, которое редактирует ./.git/config, а не ~ / .gitconfig. Приятно сохранять настройки согласованными среди всех участников проекта.
источник