Экранирование строк не является работой 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 . Спасибо!)