Как вы можете комбинировать 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 "#"
- Без аргументов - добавляет изменения всех непропускаемых отслеживаемых файлов
- Данные файлы / каталоги - только добавляет непропускные изменения в этих местах
Смотрите этот ответ для более.