web-dev-qa-db-ja.com

XML、JSON、またはYAMLへのGitログ出力?

これはかなり単純な質問です。Gitの初心者として、gitログをファイルに、できればXML、JSON、YAMLなどのシリアル化された形式で出力する方法があるかどうか疑問に思っていました。助言がありますか?

40
Andrew

ファイルに出力するには:

git log > filename.log

すべてを1行で表示するように、フォーマットを指定するには

git log --pretty=oneline >filename.log

または、sendmailなどのプログラムを介して電子メールで送信する形式にしたい

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

jSON、YAML、またはXMLを生成するには、次のようにする必要があります。

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

このGist(私のものではない)は、出力をJSONで完全にフォーマットします: https://Gist.github.com/130622

以下も参照してください。

54
huntar

私はこのようなことをして、任意のリポジトリで最後の5つのコミットを表示する最小限のWeb API/JavaScriptウィジェットを作成しました。

何らかのスクリプト言語からこれを実行している場合、really引用文字に"以外のJSONを生成して、コミットメッセージで実際の引用符をエスケープできるようにします。 (あなた意志遅かれ早かれそれらを持っている、そしてそれが物事を壊すのはいいことではない。)

そのため、恐ろしいがあまりありそうにないデリミタ^@^とこのコマンドラインができてしまいました。

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^@^},\'';

次に、(node.jsで)git logへの呼び出しのstdoutからhttp応答本文が構築されます。

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

結果は、引用符で壊れない素敵なJSONです。

13
Tim Boudreau

このスクリプトはgitログをラップし、JSON出力を生成します: https://github.com/paulrademacher/gitjson

3
Paul Rademacher

私はこれをPowershellで書いてgit logdataを取得し、jsonまたは他の形式で保存しました:

$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" 

ヘッダー名:

"commit"、 "tree"、 "parent"、 "refs"、 "subject"、 "body"、 "author"、 "commiter"

データフィールドと同期する必要があります:

--pretty = format: '%H |%T |%P |%D |%s |%b |%an |%cn;'

prettyformat docs を参照してください。
区切り記号としてパイプ|を選択します。私はそれがコミットメッセージで使用されていないという危険を冒しています。すべてのコミットのsepとしてセミコロン;を使用しました。もちろん別のものを選択する必要があります。マッチする正規表現をコーディングして、コミットメッセージでセパレータが使用されているかどうかを確認することができます。または、より複雑な正規表現をコーディングして分割ポイントを一致させるか、または Powershellスクリプトブロックをコーディングして分割を定義する とすることができます。

コード内で把握するのが最も困難な行でした。

prettyGitLogDump.Replace( ";"、 ';')-split ";"、0、 "multiline"

オプションmultilineを設定する必要があります メッセージにCR/LFがあり、その後分割が停止する可能性があるため、分割のnrが指定されている場合にのみ複数行を設定できます。したがって、2番目のparamvalue 0はすべてを意味します。

(The Replace( ";"、 ';')は、最初のコミット後にスペースを取得するためのハックです。したがって、コミットセパレーターの後にスペースを削除します。おそらく、より良い解決策があります。)

とにかく、これはgitからのログで誰がコミットしたのか、そしてその理由を確認したいWindowsユーザーやPowershellsファンにとっては実行可能な解決策になると思います。

1