2016-11-27 40 views
1

ブランチ内のすべての変更を、特別なデプロイメントロジックを実装するアプリケーションによってさらに処理する必要があります。非常に少なくとも
私が取得する必要があるでしょう:git log - xml出力を取得する方法

  • コミットSHA1
  • コミット日付ごと

ため

  • 変更されたファイルの一覧と変更タイプを、それがさらにに、おそらく些細だから取得:

    • コミット著者
    • コミットノート

    も同様です。出力はXMLである必要があります。

    そこにはJSON出力を作成するPerlスクリプトがありますが、私はXMLに固執したいと思います。

    私は解析するawkスクリプトを書いた...

    をかなり形式のオプションを試してみたが、変更のためのプレースホルダを見つけることができない、と
    git log -10 --name-status --pretty=format:"<entry><author>%an</author><commit_date>%cd</commit_date><message_body>%N</message_body></entry>" -- databases/
    を実行すると、ちょうどエントリ間の変更をダンプ出力するが、もっと「ネイティブ」なものを探したいと思う。そこには何かありますか?おそらく私は行方不明のオプションですか?

    興味のある方は、ここに私が欲しいことをするawkスクリプトがあります。まだそれはMac上でgawkで実行する必要がありますが、Cygwinのawkでうまく動作するかどうか不明です。

    # script to parse the output of git log --name-status 
    BEGIN{ 
        RS="commit "; 
        FS="\n"; 
        print "<log>"; 
    } 
    
    NR>1{ 
        StartComment=0; 
        CommentText = ""; 
        CommitText = ""; 
        AuthorText = ""; 
        DateText = ""; 
        ChangesText = ""; 
        isLast = 0; 
    
    for(i = 1; i <= NF; i++) 
    { 
    
    if (i==1) {CommitText = $i;} 
        if (match($i,/^Author/)) { 
        #remove "author :" 
        split($i,author1,": "); 
        split(author1[2],author2," <") 
        AuthorText = author2[1];} 
        else if (match($i,/^Date/)) {StartComment=1; ln=i; 
        #remove "date :" 
        split($i,dt,": "); 
        DateText = dt[2]; 
        #trim whitespaces 
        gsub(/^[ \t]+/,"",DateText); 
         } 
        else if (match($i,/^[A-Z]\s/)) {StartComment=0; 
        if(match($i,/\.sql$/)){ 
         j = i+1 
         ch_path = substr($i,2) 
         gsub(/^[ \t]+/,"",ch_path); 
         unitChange = "\t\t\t<change>\n\t\t\t\t<ChangeType>"substr($i,1,1)"</ChangeType>\n\t\t\t\t<Path>"ch_path"</Path>\n\t\t\t</change>"; 
         ChangesText = ChangesText""unitChange; 
         if (!match($(j),/^$/)){ChangesText = ChangesText"\n"} 
        } 
        } 
        else if (StartComment==1 && i>ln) { {CommentText=CommentText$i"\n"} } 
    
    } 
    
    print "\t<entry>"; 
    print "\t\t<commit-sha1>"CommitText"</commit-sha1>"; 
    print "\t\t<Author>"AuthorText"</Author>"; 
    print "\t\t<CommitDate>"DateText"</CommitDate>"; 
    print "\t\t<Changes>"; 
    print ChangesText; 
    print "\t\t</Changes>"; 
    print "\t</entry>";  
    } 
    END { 
        print "</log>" 
    } 
    
  • 答えて

    4

    git log、整形式XMLを生成し、メッセージ本文(%s%b%B)及びノート(%n)は自由形式のテキストであり、したがって、このような制御-Lとして無効なXML文字が含まれていてもよいしないであろう山括弧、またはバイトシーケンス<![CDATA[ですらあります。 (あなたのXMLエンコーダがあなたのためにそれを処理しないならば、あなたは本当にあなたを混乱させます。私は、誰かが偽のXMLエンコーダをペーストした別のVCSへのインターフェースを試みた経験から話します。偽のエンコーダーは山括弧とアンパサンドを&lt;などで置き換えていましたが、制御文字は扱えませんでした。多くのメッセージは^ LsやCDATAを持っていました。 XML)

    これは、独自のエンコーダを作成する必要があることを意味します。あなたはになりますこれはawkでこれを行います(私はあなたがawkタグを含んでいるのを見ます)。私は、メッセージ本文や音符などの任意のテキストをbase64などのスキームを使ってエンコードすることをお勧めします。

    (それは、少なくとも稀でありながら、Gitのメッセージ本文でもASCIIのNULsを含むことができることに注意してください。)

    +0

    おかげで、第二の符号化の問題を無視して、変更を含むXMLとして情報をコミットを取得する方法があります任意のネイティブgitコマンドから? – Mordechai

    +0

    いいえ、とにかくGitのソースコードを変更することはありません。 NULの可能性を引き下げたいなら、 '--pretty = format:'形式のアイテム間で%x00を使うことができます。これを使って、%Nからのノートとログメッセージ(例えば、 1つの 'git log'コマンドで実行します。しかし100%確実にするためには、 'git log --no-walk --pretty = format:%N'を使って、例えば自分自身だけでメモを取得する必要があります。 – torek

    +0

    多くのアイテム*が*制限されている(作者名やコミッター名と日付に改行やNULはありません)、いくつかの別々の 'git log'ですべてを得ることができます。しかし、コンテンツへの生のアクセスのためには、 'git cat-file --batch-check'を調べるのがよいでしょう。サイズの後ろに生のバイトが続くので、コンテンツとして解釈するバイト数を知ることができます。 – torek

    関連する問題