2010-04-23 47 views

回答

9

這個簡短的Python腳本將提供一個CSV您的SVN日誌輸出:

#!/usr/bin/env python 

import csv 
import subprocess 
import sys 
import xml.etree.cElementTree as etree 

log_text = subprocess.Popen(['svn', 'log', '--xml'] + sys.argv[1:], 
          stdout=subprocess.PIPE).communicate()[0] 
log_xml = etree.XML(log_text) 

csv_writer = csv.writer(sys.stdout) 

for child in log_xml.getchildren(): 
     csv_writer.writerow([ 
       child.attrib['revision'], 
       child.findtext('date'), 
       child.findtext('author').encode('utf-8'), 
       child.findtext('msg').encode('utf-8'), 
     ]) 

它通過命令行參數底層SVN調用,因此,如果您只想查看修訂34及更高版本,你可以調用它如下:

$ svnlog2csv -r 34:HEAD >my_spreadsheet.csv 
+0

謝謝!這個腳本對我很好。 – Johann 2012-07-25 21:53:54

2

Thanx for the script!我添加了這個輕微的修改,因爲我們的SVN倉庫是UTF-8重音字符(法國)和borked腳本:

#!/usr/bin/env python 

import csv 
import subprocess 
import sys 
import xml.etree.cElementTree as etree 
import codecs 

log_text = subprocess.Popen(['svn', 'log', '--xml'] + sys.argv[1:], 
          stdout=subprocess.PIPE).communicate()[0] 
log_xml = etree.XML(log_text) 

csv_writer = csv.writer(sys.stdout) 

for child in log_xml.getchildren(): 
     csv_writer.writerow([ 
       child.attrib['revision'], 
       child.findtext('date'), 
       child.findtext('author'), 
       child.findtext('msg').encode("utf-8"), 
     ]) 

乾杯,

+0

僅供參考 - 您不需要導入'編解碼器'以在字符串上調用'encode';這是一個有用的補充,我希望你會原諒我採用它。謝謝! – 2010-12-18 03:17:13

1

另一種快速的解決方案,我曾與是here at Chris' blog巨大的成功。這是一個Java程序,可以快速將其轉換爲CSV文件。您也可以使用在那裏顯示的在線版本。通常他會發布JavaScript文章,但我猜他也知道Java,因爲他們看起來很相似。

+2

Java!= JavaScript除了名稱中包含'Java'之外,它們不是「相似」的;網景公司的某個人應該被毆打。 – 2012-11-30 13:42:12

2

謝謝大家,非常有幫助。我發現在Windows電腦上,python csv_writer需要二進制文件輸出,否則會發出額外的回車符。以下腳本處理這種情況,並且還會在提交消息(用前斜線替換)中刪除換行符以確保單行輸出。

#!/usr/bin/env python 

import csv 
import subprocess 
import sys 
import xml.etree.cElementTree as etree 

log_text = subprocess.Popen(['svn', 'log', '--xml'] + sys.argv[1:], 
          stdout=subprocess.PIPE).communicate()[0] 
log_xml = etree.XML(log_text) 

if sys.platform == "win32": 
    import os, msvcrt 
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 

csv_writer = csv.writer(sys.stdout) 

for child in log_xml.getchildren(): 
     csv_writer.writerow([ 
       child.attrib['revision'], 
       child.findtext('date'), 
       child.findtext('author'), 
       child.findtext('msg').encode("utf-8").replace('\n','/'), 
     ]) 

(現在,還有誰願意SVN日誌採取了相同的選項,git的日誌?;-)

0

我發現這個方便的小腳本

svn log -r {2015-05-01}:{2015-05-31} http://svn.company.co.id/dev/ | tr -d '\n' | sed -r 's/-{2,}/\n/g' | sed -r 's/ \([^\)]+\)//g' | sed -r 's/^r//' | sed -r "s/[0-9]+ lines?//g" | sort -g | sed 's/ | /;/g' > list.csv 

其中出口SVN記錄從日期2015年5月1日至2015年5月31日list.csv ..在這裏我使用分號作爲分隔符..因爲我的開發人員在他們的筆記中使用逗號..