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