2012-06-19 60 views
1

我正在嘗試使用'git log --pretty = tformat'來創建xml文件日誌。不過,我有問題獲取每個提交文件的列表。git log --pretty與文件列表?

例如: 我使用這個命令

$echo '<?xml version="1.0"?>' > out.xml 
$echo '<git>' >> out.xml 
$git log --pretty=tformat:' <commit>%n  <h1>%s</h1>%n </commit>' --name-only >> out.xml 
$echo '</git>'>> out.xml 

輸出:

<?xml version="1.0"?> 
<git> 
    <commit> 
     <h1>Commit 1</h1> 
    </commit> 
    <commit> 
     <h1>Commit 2</h1> 
    </commit> 
    <commit> 
     <h1>Commit 3</h1> 
    </commit> 
</git> 

我要提交標籤與文件列表中添加標籤在側面,所以我最終輸出的樣子這

<?xml version="1.0"?> 
    <git> 
     <commit> 
      <h1>Commit 1</h1> 
      <list>file1</list> 
     </commit> 
     <commit> 
      <h1>Commit 2</h1> 
      <list>file2</list> 
     </commit> 
     <commit> 
      <h1>Commit 3</h1> 
      <list>file3</list> 
     </commit> 
    </git> 

我沒有嘗試 - 名稱只會列出文件,但不能格式化o本安輸出。

任何幫助將不勝感激。

+0

有點不相關的實際問題,但在這樣的情況下構建XML可能有點簡單,如果你看看XML2。 – user1338062

回答

3

這可能不是您要查找的內容,但腳本很容易。以下是一個實現,效率低下但功能強大。小心運行它:它將在您的整個歷史上運行。將第二行更改爲revlist=$(git rev-list -10 HEAD),以查看它僅在最後10次提交時的工作情況。它也假設你想要在文件底部進行較早的提交,按照上面的例子。一個--reverse標誌添加到git rev-list如果你願意順序爲:

#!/bin/sh 
revlist=$(git rev-list HEAD) 
(
    echo '<?xml version="1.0"?>' 
    echo '<git>' 
    for rev in $revlist 
    do 
      files=$(git log -1 --pretty="format:" --name-only $rev) 
      echo ' <commit>\n  <h1>\c' 
      echo "$(git log -1 --pretty="%s" $rev)\c" 
      echo '</h1>' 
      for file in $files 
      do 
        echo "  <list>$file</list>" 
      done 
      echo ' </commit>' 
    done 
    echo '</git>' 
) > out.xml 
+0

驚人的,非常感謝。 –

+0

不錯的一個!有沒有辦法獲取信息,如文件是否被修改,刪除或添加? –

+1

@NikhilGupta:是的,嘗試用'--name-status'替換'--name-only'。在文件名之前打印的短碼被設計爲機器可解析的。搜索[本頁](https://www.kernel.org/pub/software/scm/git/docs/git-log.html)查看「--diff-filter」以查看代碼的含義。然後只需添加一些邏輯來處理這些代碼,然後就可以開始了。 – Christopher

0

我設法與該文件的一些細微的操控所有文件信息作爲一個單一的文本字段之後(前兩行移動到末尾該文件)用下面的PowerShell腳本的:(與資源庫的名稱替換REPONAME,可以進一步自動化)

git --git-dir <path to repository> log --name-only --pretty=format:"]]></files>%n</commit>%n<commit>%n<repo>REPONAME</repo>%n<hash>%H</hash>%n<author>%an</author>%n<dt>%ct</dt>%n<subject><![CDATA[%s]]></subject>%n<files><![CDATA[" | Out-File REPONAME.xml 
$x = get-content REPONAME.xml 
@("<gitrepo>") + $x[2..$x.count] + $x[0..1] + @("</gitrepo>") | set-content REPONAME.xml 

要分手了,我不得不做一些進一步的處理在數據庫中的文件(分割。換行等),但這超出了這個答案的範圍。

此輸出文件,它看起來像:

<gitrepo> 
<commit> 
<repo>REPONAME</repo> 
<hash>388d77493cb2b4d3260cd12b1adcf23e947755f4</hash> 
<author>Some Guy</author> 
<dt>1401802177</dt> 
<subject><![CDATA[Comments added to files]]></subject> 
<files><![CDATA[ 
src/aben/blanksid.w 
src/aben/c_typop.w 
src/aben/freg.w 
src/aben/freskid.w 
src/aben/grit5.w 
src/aben/grokli.w 

]]></files> 
</commit> 
</gitrepo>