У меня есть текстовый редактор для автоматического удаления конечных пробелов при сохранении файла, и я участвую в проекте с открытым исходным кодом, у которого есть серьезные проблемы с конечными пробелами.
Каждый раз, когда я пытаюсь представить патч, я должен сначала игнорировать все изменения только пробелов вручную, чтобы выбрать только соответствующую информацию. Мало того, но когда я бегу, git rebase
я обычно сталкиваюсь с несколькими проблемами из-за них.
Поэтому я хотел бы иметь возможность добавлять в индекс только непробельные изменения, аналогичным git add -p
образом, но без необходимости выбирать все изменения самостоятельно.
Кто-нибудь знает как это сделать?
РЕДАКТИРОВАТЬ: Я не могу изменить способ работы проекта, и они решили, обсудив его в списке рассылки, игнорировать это.
источник
git apply --ignore-whitespace
иначе патч не будет применяться по понятным причинам.git add -w
так это и делается .patch does not apply
иerror while searching for
... Есть идеи?patch does not apply
ошибку.git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero
. Это не рискованно, потому что индекс уже настолько актуален, насколько это возможно, поэтому он является надежной базой для патча.Это работает для меня:
Если вы хотите сохранить тайник вокруг, это работает
Я не как тайники, но я уже столкнулся с ошибкой в мерзавец + Cygwin , где я потеряю изменения, так , чтобы убедиться , что материал пошел в reflog по крайней мере , я создал следующее:
По сути, мы создаем diff, который не включает изменения пространства, отменяем все наши изменения, а затем применяем diff.
источник
git stash
вместо проверки оформить резервную копию ваших изменений, по крайней мере, до тех пор, пока она не будет протестирована.Создайте файл исправления, содержащий только реальные изменения (исключая строки только с изменениями пробелов), затем очистите рабочее пространство и примените этот файл исправления:
Просмотрите оставшиеся отличия, затем
add
иcommit
как обычно.Эквивалентом Mercurial является следующее:
источник
Ответ, получивший наибольшее количество голосов, работает не во всех случаях из-за пробелов в контексте патча, согласно мнению пользователей в комментариях.
Я пересмотрел команду следующим образом:
Это создает патч без контекста. Не должно быть проблемой, так как патч недолговечный.
Соответствующий псевдоним, снова пересмотр того, что уже было предоставлено другими пользователями:
источник
--ignore-space-change
вместо-w
.git diff -U0 --ignore-space-change --no-color | git apply --cached --unidiff-zero
--ignore-blank-lines
противном случае вы обнаружите, что порции diff будут исправлены с неправильными смещениями, если некоторые из изменений «белого пространства», которые вы хотите игнорировать, являются удалением / добавлением пустой строки.Добавьте следующее к вашему
.gitconfig
:Спасибо ответу @Colin Herbert за вдохновение.
Синтаксис Объяснение
Финал
#
должен быть заключен в кавычки, поэтому он не рассматривается как комментарий внутри.gitconfig
, а вместо этого проходит через него и рассматривается как комментарий внутри оболочки - он вставляется между концомgit apply
и предоставленными пользователем аргументами, которыеgit
автоматически помещаются в конец командной строки. Эти аргументы здесь не нужны - мы не хотимgit apply
их использовать, отсюда и предыдущий символ комментария. Вы можете выполнить эту команду,GIT_TRACE=1 git anw
чтобы увидеть это в действии.В
--
сигналах конца аргументов и позволяют в случае , что у вас есть файл с именем-w
или что - то , что будет выглядеть как переключатель наgit diff
.Избегающие двойные кавычки
$@
необходимы для сохранения любых предоставленных пользователем аргументов в кавычках. Если"
персонаж не экранирован, он будет использован.gitconfig
синтаксическим анализатором и не достигнет оболочки.Примечание:
.gitconfig
псевдоним разбор не признает одинарные кавычки ничего особенного - его только специальные символы"
,\
,\n
, и;
(за пределы"
-quoted строки). Вот почему"
всегда нужно экранировать символ a , даже если он выглядит так, как будто он внутри строки в одинарных кавычках (о чем git совершенно не знает агностики).Это важно, например. если у вас есть удобный псевдоним для выполнения
bash
команды в корне рабочего дерева. Неправильная формулировка:Хотя правильным является:
источник
Как насчет следующего:
Команда внутри обратных кавычек получает имена файлов, которые не имеют пробелов.
источник
git add `git diff -w |grep '^+++' |cut -c7-`
если субмодули не используютсяСначала вы должны рассмотреть, является ли конечный пробел намеренным. Многие проекты, в том числе ядро Linux, Mozilla, Drupal и Kerberos (и многие другие на странице Википедии о стиле), запрещают использовать пробелы в конце. Из документации по ядру Linux:
В вашем случае проблема в другом: предыдущие коммиты (и, возможно, текущие) не следовали этому руководству.
Держу пари, что никому на самом деле не нужны конечные пробелы, и исправление проблемы может быть долгожданным изменением. Другие пользователи также могут испытывать ту же проблему, что и вы. Также вероятно, что автор (ы), которые добавляют конечные пробелы, не знают, что они делают это.
Вместо того, чтобы пытаться перенастроить git для игнорирования проблемы или отключить другие желательные функции в вашем редакторе, я бы начал с публикации в списке рассылки проекта, объясняющего проблему. Многие редакторы (и сам git) могут быть настроены для работы с конечными пробелами.
источник
Я нашел git pre-commit hook, который удаляет завершающие пробелы . Однако, если вы не можете заставить других использовать это, то это может быть недопустимым решением.
источник