Git log output para XML, JSON ou YAML?

Esta é uma pergunta bem simples: como um novato do Git, eu estava me perguntando se existe uma maneira de eu enviar meu arquivo git para um arquivo, de preferência em algum tipo de formato serializado como XML, JSON ou YAML. Alguma sugestão?

para imprimir em um arquivo:

git log > filename.log 

Para especificar um formato, como você quer tudo em uma linha

 git log --pretty=oneline >filename.log 

ou você quer que um formato seja enviado por email através de um programa como o sendmail

 git log --pretty=email |email-sending-script.sh 

para gerar JSON, YAML ou XML, parece que você precisa fazer algo como:

 git log --pretty=format:"%h%x09%an%x09%ad%x09%s" 

Essa essência (não minha) formata perfeitamente a saída em JSON: https://gist.github.com/1306223

Veja também:

Eu fiz algo assim para criar um widget mínimo de web api / javascript que mostraria os últimos 5 commits em qualquer repository.

Se você está fazendo isso de qualquer tipo de linguagem de script, você realmente quer gerar seu JSON com algo diferente de " para seu caracter de aspas, para que você possa escaping de citações reais em mensagens de commit. (Você as terá mais cedo ou mais tarde, e não é bom que isso quebre as coisas.)

Então acabei com o assustador, mas improvável, delimitador ^@^ e essa linha de comando.

 var cmd = 'git log -n5 --branches=* --pretty=format:\'{%n^@^hash^@^:^@^%h^@^,%n^@^author^@^:^@^%an^@^,%n^@^date^@^:^@^%ad^@^,%n^@^email^@^:^@^%aE^@^,%n^@^message^@^:^@^%s^@^,%n^@^commitDate^@^:^@^%ai^@^,%n^@^age^@^:^@^%cr^@^},\''; 

Então (em node.js) meu corpo de resposta http é construído a partir do stdout da chamada para git log assim:

 var out = ("" + stdout).replace(/"/gm, '\\"').replace(/\^@\^/gm, '"'); if (out[out.length - 1] == ',') { out = out.substring (0, out.length - 1); } 

e o resultado é bom JSON que não quebra com aspas.

Este script envolve o git log e produz a saída JSON: https://github.com/paulrademacher/gitjson

Eu escrevi isso no Powershell para obter o git logdata e salvá-lo como json ou outro formato:

 $header = @("commit","tree","parent","refs","subject","body","author","commiter") [string] $prettyGitLogDump= (git log MyCoolSite.Web-1.4.0.002..HEAD --pretty=format:'%H|%T|%P|%D|%s|%b|%an|%cn;') $gldata = foreach ($commit in $prettyGitLogDump.Replace("; ",';') -split ";", 0, "multiline") { $prop = $commit -split "\|" $hash = [ordered]@{} for ($i=0;$i -lt $header.count;$i++) {$hash.add($header[$i],$prop[$i])} [pscustomobject]$hash } $gldata | ConvertTo-Json | Set-Content -Path "GitLog.json" 

Os nomes de cabeça:

“commit”, “tree”, “pai”, “refs”, “subject”, “body”, “author”, “commiter”

tem que estar em sincronia com os campos de dados:

–pretty = format: ‘% H |% T |% P |% D |% s |% b |% an |% cn;’

Veja docs prettyformat .
Eu escolho tubo | como um separador. Eu estou tomando um risc que não é usado na mensagem de commit. Eu usei ponto- e- vírgula ; como um set para cada commit. Eu deveria, claro, ter escolhido outra coisa. Você poderia tentar codificar algumas expressões regulares inteligentes para combinar e verificar se seus separadores são usados ​​na mensagem de confirmação. Ou você pode codificar uma expressão regular mais complexa para corresponder ao ponto de divisão ou codificar um bloco de script PowerShell para definir a divisão .

A linha mais difícil no código para descobrir foi.

prettyGitLogDump.Replace (“;”, ‘;’) -split “;”, 0, “multilinha”

Você tem que configurar a opção multiline porque pode haver CR / LF nas mensagens e então dividir as paradas – você só pode definir múltiplas linhas se nr de divisão for dado. Portanto, segundo parâmetro 0, que significa todos.

(O Replace (“;”, ‘;’) é apenas um hack Eu recebo um espaço após o primeiro commit. Então eu removo espaço após o commit do separador. Provavelmente existe uma solução melhor.)

De qualquer forma eu acho que isso poderia ser uma solução viável para usuários do Windows ou fãs do PowerShell que querem o log do git para ver quem fez o commit e por quê.

Veja https://github.com/dreamyguy/gitlogg , o último analisador git-log => JSON você irá precisar!

Algumas das características do Gitlogg são:

  • Analise o git log de vários repositorys em um arquivo JSON .
  • Introduzido chave / valor do repository .
  • Introduziu files changed , insertions e deletions chaves / valores.
  • Introduzida chave / valor de impact , que representa as alterações cumulativas para o commit ( insertionsdeletions ).
  • Sanitize aspas duplas " convertendo-as em aspas simples ' em todos os valores que permitem ou são criados pela input do usuário, como subject .
  • Quase todos os espaços reservados pretty=format: estão disponíveis.
  • Inclua / exclua facilmente quais chaves / valores serão analisados ​​no JSON , comentando / descomentando os disponíveis.
  • Fácil de ler o código que é completamente comentado.
  • Feedback de execução de script no console.
  • Tratamento de erros (já que o caminho para os repositorys precisa ser configurado corretamente).

Sucesso, o JSON foi analisado e salvo. Sucesso, o JSON foi analisado e salvo.

Erro 001 Erro 001: o caminho para os repositorys não existe.

Erro 002 Erro 002: o caminho para os repositorys existe, mas está vazio.