Как вы можете объединить git добавить режим patch -p с diff ignore-all-space
Как я могу сделать git добавить с режимом исправления, но игнорируя изменения в пробелах.
Вариант использования - это когда вы переформатировали файл и внесли изменения в него. Я хочу сначала перенести реальные изменения кода (как показано git diff -w path), а затем зафиксировать переформатирование как отдельную фиксацию.
Ответы
Ответ 1
Я предлагаю просто roundtripping diff
Идея:
git diff --ignore-all-space | (git reset --hard && git apply)
Предупреждение: это чревато опасностью из-за git reset
(оно не будет сохранять изменения в двоичных файлах, как написано). Возможно, вам нужна функция bash, похожая на
function cleanup_patch()
{
if [ $# -lt 1 ]; then
echo 'Must provide explicit paths (wildcards allowed)';
else
git diff --ignore-all-space -- "[email protected]" |
(git checkout HEAD -- "[email protected]" &&
git apply)
fi
}
Придумайте, по-видимому, полезную опцию --binary
для diff, не соблюдая флаги игнорирования пробелов
Ответ 2
Здесь адаптация из связанного вопроса.
git diff -w --no-color | git apply --cached --ignore-whitespace
Это имеет то преимущество, что вам не нужно использовать stash
, временные файлы или выполнять reset --hard
в ваших рабочих папках.
Добавление
Решение выше только с этапами изменений, кроме редактирования только пробелов. Это не касалось патча, хотя использование --patch
для стадии не является прямым в этой ситуации.
Патч Вариант 1: отредактируйте diff в текстовом редакторе
Существует много способов реализовать это с помощью текстового редактора. Vim особенно подходит для этого.
В корневом каталоге вашего репозитория запустите Vim.
В нормальном режиме загрузите diff в пустой буфер с...
:r !git diff -w --no-color
:set ft=diff # if you want syntax highlighting
Отредактируйте diff и удалите части, которые вы не хотите выполнять.
Чтобы настроить содержимое буфера vim, запустите команду vim ex...
:w !git apply --cached --ignore-whitespace
Если вы любитель Vim, вы также можете использовать визуальный режим для сцены!
:<',>'w !git apply --cached --ignore-whitespace
Вы можете выполнить поэтапные изменения с помощью команды ex...
:!git commit -m "message"
# or
:!git commit
Очистите буфер, прочитайте неустановленные изменения и повторите
:bd! | set ft=diff | r !git diff -w --no-color
В конце концов, вы оставите только изменения в пробелах для фиксации.
Если вы не используете Vim, вы также можете выгрузить git diff
в файл, отредактировать файл, сохранить, а затем передать файл в git apply
. Зафиксировать и повторить до завершения. Это немного утомительно, но функционально.
Патч Вариант 2: Патч reset
Он возвращается из git add --patch
, но после того, как вы выполнили изменения без пробелов с помощью...
git diff -w --no-color | git apply --cached --ignore-whitespace
... вы можете отключить куски в режиме патча с помощью...
git reset --patch .
Помните, что вы удаляете изменения, которые вы хотите сохранить. Повторяйте и зафиксируйте по мере необходимости, пока вы не оставите только пробелы.
Ответ 3
Более надежная и универсальная версия ответа @ "Justin C":
anw = !git diff -U0 -w --no-color -- \"[email protected]\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
- Без аргумента - добавляет изменения без пробелов в отслеживаемых файлах
- Данные файлы/каталоги - добавляет не-пробельные изменения в этих местах
Подробнее см. этот ответ.
Ответ 4
Если вы хотите сделать git добавить --patch, но игнорировать все пробелы, как спрашивает афер, вы можете сделать это в одной команде:
git diff -w --no-color | git apply --cached --ignore-whitespace && git checkout -- . && git reset && git add -p
git diff -w --no-color
создает diff
git apply --cached --ignore-whitespace
применяет пробел, игнорирующий пробел, и индексирует его
git checkout -- .
удаляет неиндексированные изменения "пробелов"
git reset
сбрасывает индекс только с изменениями без пробелов
git add -p
добавляет изменения без пробелов в режиме патча
Оберните это в псевдоним, например:
alias gwap="git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero && git checkout -- . && git reset && git add -p"
Или, если вы используете систему на основе UNIX, например, я:
gwap= !git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero && git checkout -- . && git reset && git add -p
(Обратите внимание, что я добавил опции -U0
и --unidiff-zero
соответственно для устранения проблем, связанных с контекстом, в соответствии с этим комментарием.
Источник: https://til.hashrocket.com/posts/696df00135-remove-whitespace-changes-then-git-add-p