Git config псевдоним Escape

Я пытаюсь написать псевдоним git, который удаляет из сообщений коммита строку «[ci skip]» (помещается в конце сообщения), но у меня проблемы с экранированием. Псевдоним берет всю фиксацию от той, которая передана в качестве аргументаHEAD.

Если я запускаю следующую команду:

git filter-branch -f --msg-filter "sed -e \"s/\[ci skip\]$//g\"" master..HEAD

это работает как ожидалось. Во всяком случае, если я создаю следующий псевдоним:

unwip = !sh -c 'git filter-branch -f --msg-filter \"sed -e \\\"s/\[ci skip\]$//g\\\"\" $0..HEAD'

и я бегуgit unwip master он жалуется на плохой конфиг, но я ожидаю, что он будет вести себя как предыдущие комманд. Как я могу это исправить?

 Dilettant27 июн. 2016 г., 19:05
Просто угадаю: может быть, также защитит обратную косую черту, выходящую из квадратных скобок, дополнительной дополнительной обратной косой чертой, вот так\\\[ci skip\\\] ?
 se7entyse7en28 июн. 2016 г., 00:03
@ Дилетант не работает, к сожалению.

Ответы на вопрос(2)

Универсальное решение

Получениеgit Псевдоним для правильной передачи парсера может быть ошеломляющим набором\\\\" шум, поэтому я создал два псевдонима:

# Quote / unquote a sh command, converting it to / from a git alias string
quote-string = "!read -r l; printf \\\"!; printf %s \"$l\" | sed 's/\\([\\\"]\\)/\\\\\\1/g'; printf \" #\\\"\\n\" #"
quote-string-undo = "!read -r l; printf %s \"$l\" | sed 's/\\\\\\([\\\"]\\)/\\1/g'; printf \"\\n\" #"

Это позволяет вам конвертировать все, что вы могли набрать вsh+Например:

$ echo '\"'

\"

В строку в кавычках подходит для псевдонима:

$ git quote-string
echo '\"'

"!echo '\\\"' #"

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

git quote-string |sponge

Отвечая на конкретный вопрос ОП

С помощьюgit quote-string по команде ОП я получаю:

"!git filter-branch -f --msg-filter \"sed -e \\\"s/\\[ci skip\\]$//g\\\"\" master..HEAD #"

Таким образом, чтобы использовать псевдоним псевдонима OP, под[alias] в~/.gitconfig, добавлять:

unwip = "!git filter-branch -f --msg-filter \"sed -e \\\"s/\\[ci skip\\]$//g\\\"\" master..HEAD #"

отладка

Иногда приятно видеть, что происходит под капотом. Попробуйте этот псевдоним:

debug  = "!set -x; GIT_TRACE=2 GIT_CURL_VERBOSE=2 GIT_TRACE_PERFORMANCE=2 GIT_TRACE_PACK_ACCESS=2 GIT_TRACE_PACKET=2 GIT_TRACE_PACKFILE=2 GIT_TRACE_SETUP=2 GIT_TRACE_SHALLOW=2 git"

Просто вставьтеdebug междуgit и то, что обычно следует, например, для вопроса ОП:

git debug unwip

+ git использования/bin/sh выполнять псевдонимы, начиная с!*, Чтобы обойти это, создайте командную строку как:bash -c 'echo \\\"' а затем передать этоgit quote-string.

* Смотрите заголовок «Отладка» для доказательства.

 Eliot30 сент. 2016 г., 21:48
Отлично! Одна проблема, когда я бегуgit quote-string выводит на несколько строк, Также вы ссылаетесьgit shell-quote в вашем посте, я полагаю, вы имели в видуquote-string?
 Eliot05 окт. 2016 г., 22:27
Похоже, что новые псевдонимы, которые вы вставили, идентичны старым.Я создал чат но не смог пригласить вас по какой-то причине.
 Tom Hale01 окт. 2016 г., 05:26
Благодарю. Я исправил терминологию и скопировал / вставил из моей работыgitconfig заquote-string, Я также добавил скрипт для многострочных псевдонимов. Поговорите в чате, если у вас все еще есть проблемы с многострочным выводом?
Решение Вопроса

РЕДАКТИРОВАТЬ Это решение не работает во всех случаях.Вот это правильное решение, которое работает во всех случаях.

я используюbash как командная строка и следующий псевдоним работал для меня:

unwip = "!f() { git filter-branch --msg-filter 'sed -e "s/[ci skip/]$/g"' $1..HEAD ; }; f"

Единственным недостатком является то, что вы указываете переводчика и всегда используетеsh, В моем случае я полагаюсь на оболочку пользователя. Хотя я не верю, что это будет проблемой в любой из основных оболочек, поскольку мы занимаемся только базовыми вещами.

 alexK06 окт. 2016 г., 09:00
Хорошая точка зрения. Спасибо, что поймали это!
 Tom Hale21 сент. 2016 г., 14:35
Это неверный пример -" послеsed -e на самом делеконцы первая строка в кавычках. Цветная подсветка синтаксиса демонстрирует это. Вам повезло, что; символы находятся внутри второй строки в кавычках, в противном случаеgit будет относиться; в качестве символа комментария и игнорировать остальную часть строки. Увидетьмой ответ для правильного решения.

Ваш ответ на вопрос