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



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



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



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



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



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

593   8  

8 ответов:

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

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 -

обновление

добавлены параметры -U0 и --unidiff-zero соответственно, чтобы обойти проблемы сопоставления контекста, согласно комментарий.

в основном он применяет патч, который будет применяться с add без изменения пробельных символов. Вы заметите, что после git addnw your/file по-прежнему будут неиндексированных изменений, это пробелы слева.

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

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

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

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

Я не люблю тайники, но я есть столкнулся с ошибкой в git + cygwin, где я теряю изменения, поэтому, чтобы убедиться, что материал пошел в рефлог, по крайней мере, я настроил следующее:

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

в основном мы создаем diff, который не включает изменения пространства, возвращаем все наши изменения, а затем применяем diff.

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

git diff > резервное копирование
git diff-w > изменения
git reset --hard
патч

просмотрите оставшиеся различия, затем add и commit как обычно.

эквивалент для Mercurial должен сделать это:

HG diff > резервное копирование
hg diff-w > изменения
hg revert --all
HG import --no-commit changes

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

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

$ 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' -

добавьте следующее к вашему .gitconfig:

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

спасибо @Colin Herbert's answer для вдохновения.

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

финал # должны быть процитированы, чтобы это не рассматривалось как комментарий внутри .gitconfig, но вместо этого проходит через и рассматривается как комментарий внутри оболочки-он вставляется между концом git apply и пользовательские аргументы, которые git автоматически помещается в конце командной строки. Эти аргументы здесь не нужны-мы не хотим git apply потреблять их, следовательно, предыдущий символ комментария. Вы можете запустить эту команду как GIT_TRACE=1 git anw чтобы увидеть это в действии.

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

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

Примечание: .gitconfig разбор псевдонимов не распознает одинарные кавычки как что - то особенное-его единственными специальными символами являются ",\,\n и ; (возле "-строка, заключенная в кавычки). Вот почему " всегда должен быть экранирован, даже если он выглядит так, как будто он находится внутри строки с одной кавычкой (которая git полностью агностик о).

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

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

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

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

Как насчет следующего:

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

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

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

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

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

Я бы поспорил, что никто действительно не хочет, чтобы конечные пробелы, и исправление проблемы может быть приятным изменением. Другие пользователи также могут испытывать те же проблемы, что и вы. Также вероятно, что участники, добавляющие конечные пробелы, не знают, что они это делают.

вместо того, чтобы пытаться перенастроить git, чтобы игнорировать проблему, или отключить в противном случае желаемую функциональность в вашем редакторе, я бы начал с сообщение в список рассылки проекта с описанием проблемы. Многие редакторы (и сам git) могут быть настроены для работы с конечными пробелами.

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

  #!/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

Comments

    Ничего не найдено.