Как вы можете объединить git добавить режим patch -p с diff ignore-all-space

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

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

+26
источник поделиться
4 ответа

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

Придумайте, по-видимому, полезную опцию --binary для diff, не соблюдая флаги игнорирования пробелов

+3
источник

Здесь адаптация из связанного вопроса.

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 .

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

+21
источник

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

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

Подробнее см. этот ответ.

+1
источник

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

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос