Как вы можете объединить режим git add patch -p с игнорирующим все пространство diff? - PullRequest
30 голосов
/ 04 июля 2011

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

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

Ответы [ 4 ]

21 голосов
/ 12 марта 2013

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

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 .

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

1 голос
/ 27 июня 2017

Если вы хотите выполнить 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 создает 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

1 голос
/ 14 сентября 2016

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

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

Подробнее см. . .

1 голос
/ 04 июля 2011

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

Я предлагаю просто перевернуть 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 -- "$@" |
            (git checkout HEAD -- "$@" &&
             git apply)
    fi
}

. Если вы хотите использовать на первый взгляд полезную опцию --binary, чтобы diff не учитывал флаги игнорирования пробелов

...