Добавить только изменения без пробелов
у меня есть текстовый редактор, чтобы автоматически обрезать конечные пробелы при сохранении файла, и я вклад в проект с открытым исходным кодом, который имеет серьезные проблемы с пробела.
каждый раз, когда я пытаюсь отправить патч, я должен сначала игнорировать все изменения пробелов только вручную, чтобы выбрать только соответствующую информацию. Не только это, но и когда я бегу git rebase Я обычно сталкиваюсь с несколькими проблемами из-за них.
как таковой я хотел бы иметь возможность добавить к индекс изменяется только без пробелов, аналогично тому, что git add -p делает, но без необходимости выбирать все изменения самостоятельно.
кто-нибудь знает, как это сделать?
EDIT: I не может изменить способ работы проекта, и они решили, после обсуждения его в списке рассылки, игнорировать это.
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