Могу ли я экранировать символы в выводе журнала git? - PullRequest
7 голосов
/ 16 февраля 2012

Я хочу опубликовать процесс вывода git log и играю с настройками --pretty. Когда я, например, делать

--pretty=format:'{"sha":"%h","message":"%B","author":"%aN <%aE>","commit":"%cE","date":"%cD"}

Я получаю JSON-подобный вывод; когда я вставляю { или } или даже " в сообщение коммита, это портит мой вывод.

Есть ли способ сказать git log, что нужно бежать от этих символов, например добавив \?

Есть два похожих вопроса Вывод журнала Git в XML, JSON или YAML и Вывод журнала Git предпочтительно в виде XML , но оба они не обращаются к экранированию специальных символов ( например, если в случае XML я поставлю <foo> в своем сообщении о фиксации, результирующий XML будет поврежден).

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Экранирование строк не является работой Git; git log не имеет ничего, что поможет вам сделать это. Чтобы добиться того, что вам нужно, вам нужно что-то вроде sed, чтобы сделать редактирование строки для вас.

Попробуйте это (должно работать в большинстве оболочек, но я проверял только в Cygwin bash):

function escape_chars {
    sed -r 's/(\{\}")/\\\1/g'
}
function format {
    sha=$(git log -n1 --pretty=format:%h $1 | escape_chars)
    message=$(git log -n1 --pretty=format:%B $1 | escape_chars)
    author=$(git log -n1 --pretty=format:'%aN <%aE>' $1 | escape_chars)
    commit=$(git log -n1 --pretty=format:%cE $1 | escape_chars)
    date=$(git log -n1 --pretty=format:%cD $1 | escape_chars)
    echo "{\"sha\":\"$sha\",\"message\":\"$message\",\"author\":\"$author\",\"commit\":\"$commit\",\"date\":\"$date\"}"
}

for hash in $(git rev-list)
do
  format $hash
done

Выше будут экранированы { и }, а не \, хотя из JSON.org оба \{ и \} являются недопустимыми escape-символами; только \ и " необходимо экранировать. (Замените выражение sed на sed -r 's/("\\)/\\\1/g' для истинного вывода JSON.)

Я также оставил значение "commit", как оно есть в вашем примере, хотя команда %cE фактически дает адрес электронной почты коммиттера; Я не уверен, что это то, что вы хотели.

(теперь это включает правильное, но отклоненное редактирование от macrobug . Спасибо!)

0 голосов
/ 16 февраля 2012

Я не знаю, как это можно сделать, используя только git log, но простое другое решение - использовать git log для генерации CSV-подобного вывода (с разделенным табуляцией полем) и передачи этого вывода в скрипт Python, который обрабатывает генерацию JSON с правильной кавычкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...