У меня есть текстовый редактор, чтобы автоматически обрезать конечные пробелы при сохранении файла, и я вклад в проект с открытым исходным кодом, который имеет серьезные проблемы с пробела.
Каждый раз, когда я пытаюсь представить патч я должен сначала пропустить все пробельные символы-меняется только вручную, выбирать только необходимую информацию. Не только это, но когда я выполните 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 файла/
по-прежнему будет неиндексированных изменений, это'ы на пробелы слева.
... Нет-цвет не'т необходимости, но так как у меня цветов всегда, я должен использовать его. В любом случае, лучше перебдеть, чем недобдеть.
Это работает для меня:
Если вы хотите держать заначку вокруг, это работает
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
В основном мы создаем дифф, что не'т включать изменения пространства, отмените все наши изменения, и затем применить дифф.
Создать патч-файл, содержащий только реальные изменения (за исключением строк с пробелами изменения), затем очистите ваше рабочее пространство и применить этот патч:
ГИТ дифф > резервное копирование<БР> ГИТ дифф -з > изменения<БР> ГИТ сброс --жесткий<БР> патч < изменения
Комментарий остальные различия, затем добавить
и обязательства
, как обычно.
Эквивалент для Mercurial-это для этого:
НД дифф > резервное копирование<БР> НД дифф -з > изменения<БР> НД вернуться-все<БР> импорт НД-нет фиксации изменений
Добавьте следующие строки в ваш .gitconfig хранит настройки
:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
Благодаря @Колин Герберт'ы ответ для вдохновения.
Синтаксис Объяснение
Финал #
должны быть в кавычках, так это's не рассматривал его в качестве комментария внутри .gitconfig хранит настройки, но вместо этого передается и обрабатывается как комментарий внутри оболочки - она вставляется между концом
ГИТ применяются и передаваемых аргументов, что ГИТ
автоматически помещает в конец командной строки. Эти аргументы не'т хотела, здесь - мы не'т хотите, ГИТ применить
, чтобы потреблять их, следовательно, предшествующим комментарием характер. Вы можете запустить эту команду как GIT_TRACE=1 ЗПР ГИТ
, чтобы увидеть это в действии.
В --
сигналы заканчиваются аргументы и позволяет для случае, если у вас есть файл с именем -з
или что-то, что выглядело бы как переключиться на гит дифф
.
Бежал двойные кавычки вокруг $@
требуется сохранять предоставленные пользователем, цитируют Аргументы. Если в "
символ не избежал, он будет поглощен `.парсер gitconfig хранит настройки и не достигнет оболочки.
Примечание: .gitconfig хранит настройки псевдонимов разбора не'т признают одиночные кавычки, как что-то особенное - его только специальные символы в
",
`, \N
и ;
(за "
в кавычки). Вот почему в "
всегда должны быть экранированы, даже если это выглядит как это's внутри одиночной кавычки (что Git-это совершенно агностик о).
Это важно, например. если у вас есть удобный псевдоним для выполнения команды баш
в рабочем дереве'корней. Неправильные формулировки:
sh = !bash -c '"$@"' -
В то время как правильным является:
sh = !bash -c '\"$@\"' -
Топ-проголосовали ответ не работает во всех случаях из-за пробелов в контексте патч по пользователям в комментариях.
Я пересмотрела команду следующим образом:
$ 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' -
Я нашел ГИТ пре-коммит Хук, который удаляет конечные пробелы. Однако, если вы можете'т получить другие, чтобы использовать это, то он не может быть допустимым решением.
#!/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
Вы должны сначала рассмотреть, если пробельный является намеренным. Многие проекты, в том числе ядро Linux, например, друпал, и Kerberos (подборка из страницы Википедии по стилю) запретить пробелы. Из документации ядра Linux:
получайте приличный редактор и Дон'т оставьте пробелы в конце строк.
В вашем случае, проблема наоборот: предыдущие коммиты (а может и нынешние) не следуют этому правилу.
Я'д пари, что никто не хочет, чтобы пробелы, и решение данной проблемы может быть долгожданное изменение. Другие пользователи также могут столкнуться с той же проблемой вы. Это's также вероятно, что партнеру (- ам), которые размещают пробельный не знают, что они делают так.
Вместо того, чтобы заново настроить Git, чтобы игнорировать эту проблему, или отключить, в противном случае желательной функциональности в ваш редактор, Я'д начните с поста в список рассылки проекта с описанием проблемы. Многие редакторы (и Git сам) может быть настроен, чтобы справиться с пробела.