Добавьте следующее к вашему .gitconfig:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
Спасибо ответу @Colin Herbert за вдохновение.
Синтаксис Объяснение
Финал #должен быть заключен в кавычки, поэтому он не рассматривается как комментарий внутри .gitconfig, а вместо этого проходит через него и рассматривается как комментарий внутри оболочки - он вставляется между концом git applyи предоставленными пользователем аргументами, которые gitавтоматически помещаются в конец командной строки. Эти аргументы здесь не нужны - мы не хотим git applyих использовать, отсюда и предыдущий символ комментария. Вы можете выполнить эту команду, GIT_TRACE=1 git anwчтобы увидеть это в действии.
В --сигналах конца аргументов и позволяют в случае , что у вас есть файл с именем -wили что - то , что будет выглядеть как переключатель на git diff.
Избегающие двойные кавычки $@необходимы для сохранения любых предоставленных пользователем аргументов в кавычках. Если "персонаж не экранирован, он будет использован .gitconfigсинтаксическим анализатором и не достигнет оболочки.
Примечание: .gitconfigпсевдоним разбор не признает одинарные кавычки ничего особенного - его только специальные символы ", \, \n, и ;(за пределы "-quoted строки). Вот почему "всегда нужно экранировать символ a , даже если он выглядит так, как будто он внутри строки в одинарных кавычках (о чем git совершенно не знает агностики).
Это важно, например. если у вас есть удобный псевдоним для выполнения bashкоманды в корне рабочего дерева. Неправильная формулировка:
sh = !bash -c '"$@"' -
Хотя правильным является:
sh = !bash -c '\"$@\"' -
git apply --ignore-whitespaceиначе патч не будет применяться по понятным причинам.