2012-02-15 14 views
6

Chcę opublikować przetwarzanie danych wyjściowych z git log i grałem z ustawieniami --pretty. Kiedy ja np. doCzy mogę uniknąć znaków w logu wyjścia git?

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

Otrzymuję wynik podobny do JSON; kiedy wstawiam { lub } lub nawet " do komunikatu zatwierdzenia, to zakłóca moje wyniki.

Czy istnieje sposób, aby powiedzieć git log, aby uniknąć tych znaków, np. przez dodanie numeru \?

Istnieją dwa podobne pytania Git log output to XML, JSON or YAML i Git log output preferably as XML, ale oboje nie uwzględniają cytowanie znaków specjalnych (na przykład, jeśli w przypadku XML kładę <foo> w moim popełnienia wiadomości otrzymaną XML zostanie przerwane).

+0

Należy użyć 'git REV-list' skryptów – knittl

Odpowiedz

4

Uciekające struny to nie praca Gita; git log nie ma niczego, co mogłoby ci w tym pomóc. Aby osiągnąć to, czego szukasz, będziesz potrzebował czegoś takiego, jak sed, aby wykonać edycję ciągów.

Spróbuj tego (powinien działać w większości powłok, ale mam tylko zaznaczone w 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 

Powyższy ujdzie { i } i nie \, chociaż od JSON.org zarówno \{ i \} są niepoprawne ucieczki; tylko \ i " trzeba uciec. (. Wymień wyrażenia sed z sed -r 's/("\\)/\\\1/g' prawdziwego wyjścia JSON)

Ja również opuścił wartość „commit”, jak to jest w przykładzie, chociaż komenda %cE faktycznie daje adres email commiter za; Nie jestem pewien, czy to właśnie zamierzałeś.

(ta zawiera teraz correct but rejected edit przez macrobug. Dzięki!)

+1

Nowsze wersje git wymagają 'git rev-list --all' – maxmil

0

Nie wiem, jak można to zrobić tylko za pomocą git log, ale prostym innym rozwiązaniem byłoby użycie git log do wygenerowania wyjścia podobnego do CSV (z polem oddzielonym tabulatorami) i wyprowadzenia tego wyniku do skryptu python, który obsługuje generowanie JSON z prawidłowym cytatem.

+1

nie a, w formacie CSV również muszą być uciekł? Lub czy "git log" to zrobi? –

Powiązane problemy