Добавить только непробельного изменения

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

Каждый раз, когда я пытаюсь представить патч я должен сначала пропустить все пробельные символы-меняется только вручную, выбирать только необходимую информацию. Не только это, но когда я выполните Git для перебазирования я обычно столкнуться с рядом проблем из-за них.

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

Кто-нибудь знает, как это сделать?

Редактировать: я не изменить способ проектных работ, и они решили, после обсуждения в списке рассылки, чтобы не замечать этого.

Решение

Решение @Фрю было'т достаточно, что мне нужно, так это псевдоним, который я сделал для таже проблема:

alias.addnw=!sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero -'

Или вы можете просто запустить:

git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -

Обновление##

Добавлены опции -Ц0, и --unidiff-ноль соответственно, чтобы обойти контексте согласования вопросов, по данным этот комментарий.

В основном она применяет патч, который будет применяться с Добавить без пробелов изменения. Вы заметите, что после ГИТ addnw файла/ по-прежнему будет неиндексированных изменений, это'ы на пробелы слева.

... Нет-цвет не'т необходимости, но так как у меня цветов всегда, я должен использовать его. В любом случае, лучше перебдеть, чем недобдеть.

Комментарии (28)

Это работает для меня:

Если вы хотите держать заначку вокруг, это работает

git stash && git stash apply && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch

Я не'т, как в тайниках, но я ** наткнетесь на баг в Git + с Cygwin, где я теряю изменений, поэтому убедитесь, что у reflog, по крайней мере, я установила следующее:

git add . && git commit -am 'tmp' && git reset HEAD^ && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch

В основном мы создаем дифф, что не'т включать изменения пространства, отмените все наши изменения, и затем применить дифф.

Комментарии (9)

Создать патч-файл, содержащий только реальные изменения (за исключением строк с пробелами изменения), затем очистите ваше рабочее пространство и применить этот патч:

ГИТ дифф > резервное копирование<БР> ГИТ дифф -з > изменения<БР> ГИТ сброс --жесткий<БР> патч < изменения

Комментарий остальные различия, затем добавить и обязательства, как обычно.

Эквивалент для Mercurial-это для этого:

НД дифф > резервное копирование<БР> НД дифф -з > изменения<БР> НД вернуться-все<БР> импорт НД-нет фиксации изменений

Комментарии (13)

Добавьте следующие строки в ваш .gitconfig хранит настройки:

anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"

Благодаря @Колин Герберт'ы ответ для вдохновения.

Синтаксис Объяснение

Финал # должны быть в кавычках, так это's не рассматривал его в качестве комментария внутри .gitconfig хранит настройки, но вместо этого передается и обрабатывается как комментарий внутри оболочки - она вставляется между концомГИТ применяются и передаваемых аргументов, что ГИТ автоматически помещает в конец командной строки. Эти аргументы не'т хотела, здесь - мы не'т хотите, ГИТ применить, чтобы потреблять их, следовательно, предшествующим комментарием характер. Вы можете запустить эту команду как GIT_TRACE=1 ЗПР ГИТ, чтобы увидеть это в действии.

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

Бежал двойные кавычки вокруг $@ требуется сохранять предоставленные пользователем, цитируют Аргументы. Если в " символ не избежал, он будет поглощен `.парсер gitconfig хранит настройки и не достигнет оболочки.

Примечание: .gitconfig хранит настройки псевдонимов разбора не&#39;т признают одиночные кавычки, как что-то особенное - его только специальные символы в",`, \N и ; (за "в кавычки). Вот почему в " всегда должны быть экранированы, даже если это выглядит как это's внутри одиночной кавычки (что Git-это совершенно агностик о).

Это важно, например. если у вас есть удобный псевдоним для выполнения команды баш в рабочем дереве'корней. Неправильные формулировки:

sh = !bash -c '"$@"' -

В то время как правильным является:

sh = !bash -c '\"$@\"' -
Комментарии (1)

Топ-проголосовали ответ не работает во всех случаях из-за пробелов в контексте патч по пользователям в комментариях.

Я пересмотрела команду следующим образом:

$ git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero

Это создает патч без контекста. Должны'т быть проблемой, так как патч является кратковременным.

Соответствующий псевдоним, опять пересмотр того, что уже были предоставлены другими пользователями:

addw = !sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero' -
Комментарии (2)

Как о следующем:

git add `git diff -w --ignore-submodules |grep "^[+][+][+]" |cut -c7-`

Команды внутри backquotes получает имена файлов, которые имеют непробельного изменения.

Комментарии (1)

Я нашел ГИТ пре-коммит Хук, который удаляет конечные пробелы. Однако, если вы можете'т получить другие, чтобы использовать это, то он не может быть допустимым решением.

  #!/bin/sh

  if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
     against=HEAD
  else
     # Initial commit: diff against an empty tree object
     against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
  fi
  # Find files with trailing whitespace
  for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq` ; do
     # Fix them!
     sed -i 's/[[:space:]]*$//' "$FILE"
  done
  exit
Комментарии (2)

Вы должны сначала рассмотреть, если пробельный является намеренным. Многие проекты, в том числе ядро Linux, например, друпал, и Kerberos (подборка из страницы Википедии по стилю) запретить пробелы. Из документации ядра Linux:

получайте приличный редактор и Дон'т оставьте пробелы в конце строк.

В вашем случае, проблема наоборот: предыдущие коммиты (а может и нынешние) не следуют этому правилу.

Я'д пари, что никто не хочет, чтобы пробелы, и решение данной проблемы может быть долгожданное изменение. Другие пользователи также могут столкнуться с той же проблемой вы. Это's также вероятно, что партнеру (- ам), которые размещают пробельный не знают, что они делают так.

Вместо того, чтобы заново настроить Git, чтобы игнорировать эту проблему, или отключить, в противном случае желательной функциональности в ваш редактор, Я'д начните с поста в список рассылки проекта с описанием проблемы. Многие редакторы (и Git сам) может быть настроен, чтобы справиться с пробела.

Комментарии (2)