2011-01-05 13 views
34

Questa è una domanda piuttosto semplice: come un newbie Git mi chiedevo se c'era un modo per far uscire il mio log git su un file, preferibilmente in un qualche tipo di formato serializzato come XML, JSON o YAML. Eventuali suggerimenti?Uscita log Git in XML, JSON o YAML?

risposta

48

per output in un file:

git log > filename.log 

Per specificare un formato, come si vuole tutto su una linea di

git log --pretty=oneline >filename.log 

o se si vuole un formato saranno inviati tramite un programma come sendmail

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

per generare JSON, YAML o XML sembra che avete bisogno di fare qualcosa di simile:

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

Questa sostanza (non mia) Formati perfettamente uscita in JSON: https://gist.github.com/1306223

Vedi anche:

+1

Questo ha funzionato come un fascino, grazie! Per i futuri lettori, ecco un link agli shortcode utilizzati da "format": http://www.kernel.org/pub/software/scm/git/docs/git-log.html – Andrew

+0

@andrew aww ... link broke ... – Marty

+0

Hmm. Bene, tutti i riferimenti che posso trovare puntano a quella stessa pagina spezzata, quindi vergogna per chiunque abbia buttato giù la documentazione git senza un reindirizzamento. Boo. – Andrew

10

Ho fatto qualcosa del genere per creare un widget minimo di web api/javascript che mostrasse gli ultimi 5 commit in qualsiasi repository.

Se si sta facendo questo da qualsiasi tipo di linguaggio di scripting, si davvero desidera generare il JSON con qualcosa di diverso per il tuo personaggio " preventivo, in modo che si può sfuggire citazioni reali messaggi di commit. (È volontà li hanno, prima o poi, e non è bello per quello di rompere le cose.)

Così ho finito con il terribile ma improbabile delimitatore ^@^ e questo da riga di 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^@^},\''; 

Poi (in node.js) il mio corpo risposta HTTP è costruito da stdout della chiamata alla git log così:

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

e il risultato è bello JSON che non si rompe con citazioni.

+0

Una soluzione rapida per l'escape di caratteri speciali nei messaggi di commit sarebbe utilizzare '% f' invece di'% s' nella stringa di formato: '% f: riga oggetto igienizzata, adatta per un nome file' –

+0

FWIW, un progetto che utilizza questo approccio [è qui] (https: // github.com/timboudreau/gittattle) –

+0

Vale la pena menzionare che ora è possibile farlo utilizzando le stringhe del modello ES6, annullando la necessità di utilizzare il delimitatore^@^e la sostituzione della stringa del nodo. – Gary

0

Ecco https://github.com/dreamyguy/gitlogg, l'ultimo git-log => JSON parser avrete mai bisogno!

Alcune delle caratteristiche Gitlogg s' sono:

  • analizzare i git log di più repository in un unico file di JSON.
  • Introdotto repository chiave/valore.
  • Introdotto files changed, insertions e deletions chiavi/valori.
  • Introdotto impact chiave/valore, che rappresenta le modifiche cumulative per il commit (insertions - deletions).
  • Sanitizza le virgolette " convertendole in virgolette singole ' su tutti i valori che consentono o vengono creati dall'input dell'utente, ad esempio subject.
  • Quasi tutti i segnaposto pretty=format: sono disponibili.
  • Inserire/escludere facilmente quali chiavi/valori verranno analizzati in JSON commentando/rimuovendo quelli disponibili.
  • Codice di facile lettura che è stato completamente commentato.
  • Feedback esecuzione esecuzione script su console.
  • Gestione degli errori (poiché il percorso per i repository deve essere impostato correttamente).

Success, the JSON was parsed and saved. Successo, il JSON è stato analizzato e salvato.

Error 001 Errore 001: percorso per repository non esiste.

Error 002 Errore 002: il percorso per gli archivi esiste, ma è vuoto.