Как вы можете комбинировать git add patch -p mode с игнорирующим все пространство diff?

Как я могу сделать git add с режимом патча, но игнорируя изменения пробелов.

Вариант использования - когда вы переформатировали файл и также внесли в него изменения. Я хочу сначала зафиксировать изменения реального кода отдельно (как показано путем git diff -w path), а затем зафиксировать переформатирование как отдельный коммит.

4 ответа

Решение

Примечание: этот ответ старый. 6 лет спустя, другой ответ от Джастина намного лучше. Предпочитаю использовать git apply --cached

Я предлагаю просто обойти разность

Идея:

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 -- "$@" |
            (git checkout HEAD -- "$@" &&
             git apply)
    fi
}

Afaict, казалось бы, полезно --binary опция diff не учитывает пробелы, игнорирует флаги

Вот адаптация из смежного вопроса.

git diff -w --no-color | git apply --cached --ignore-whitespace

Преимущество, которое вам не нужно использовать stash, временные файлы или выполнить reset --hard на ваших рабочих папках.

добавление

Решение выше только этапы изменения, за исключением правки только пробел. Это не относится к патчу, хотя с помощью --patch этап не прямо в этой ситуации.

Вариант исправления 1: редактировать различия в текстовом редакторе

Есть много способов реализовать это с помощью текстового редактора. 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: сброс патча

Это от git add --patch, но как только вы поставили непробельные изменения с...

git diff -w --no-color | git apply --cached --ignore-whitespace

... вы можете удалить фрагменты в режиме патча с помощью...

git reset --patch .

Имейте в виду, что вы удаляете изменения, которые хотите сохранить. Повторяйте и фиксируйте при необходимости, пока не останетесь только изменения пробелов.

Если вы хотите выполнить git add --patch, но игнорируете все пробелы, как просит аскер, вы можете сделать это одной командой:

git diff -w --no-color | git apply --cached --ignore-whitespace && git checkout -- . && git reset && git add -p

git diff -w --no-color создает разницу

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

Более надежная и универсальная версия ответа @"Джастина С":

anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
  • Без аргументов - добавляет изменения всех непропускаемых отслеживаемых файлов
  • Данные файлы / каталоги - только добавляет непропускные изменения в этих местах

Смотрите этот ответ для более.

Другие вопросы по тегам