2015-03-02 72 views
3

我已經通過如何使用git log提取changeid --format =?使用:

git的日誌文件不見了--format

,但我不明白的方式來提取變化-ID(Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b如下面的例子更改-ID中)命令git log --format。

$ git log -1 

    commit 29a6bb1a059aef021ac39d342499191278518d1d 

    Author: A. U. Thor <[email protected]> 

    Date: Thu Aug 20 12:46:50 2009 -0700 

     Improve foo widget by attaching a bar. 
     We want a bar, because it improves the foo by providing more 
     wizbangery to the dowhatimeanery. 
     Bug: #42 
     Change-Id: Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b 
     Signed-off-by: A. U. Thor <[email protected]> 
     CC: R. E. Viewer <[email protected]> 

有沒有辦法做到這一點?提前致謝!

+1

讓我們嘗試'git log --pretty = short | grep Change-Id' – 2015-03-02 20:38:20

+1

或'git log -1 | grep Change-Id' – 2015-03-02 20:44:04

+0

或者如果你只想從上次提交中提取它'git log -1 | grep Change-Id' – 2015-03-02 20:44:14

回答

3

就git而言,沒有更改ID。 (這是在郵件正文中只有一條線路,和git可以給你的郵件正文,或抑制郵件正文,但它不會給你單獨線路郵件正文中。)

要將git log的輸出限制爲消息正文,請使用%b。要僅將輸出限制爲郵件主題,請使用%s。要獲得「原體」(主體+身體)使用%B

在任何情況下,您都需要一些外部程序來從消息正文中剪切出有趣的行。正如其他人已經評論過的,grep非常適合這一點。


除非你的第一行(主題,%s,一部分),當你說「身體」的意思是「原始的身體」(%B部分)。然後%s會給你第一行。像往常一樣,這些描述有些模糊和鬆散,所以當有人說「信息主體」時,通常值得澄清這意味着什麼。 「你是指原始的主體 - 身體還是身體 - 主體?」這是使用實際格式指令(%s,%b,%B)真正發光的地方,因爲這些指令是明確的。

0

你要開始與http://blog.lost-theory.org/post/how-to-parse-git-log-output/

然後你在腳本中添加「%B」身體標誌的格式,以獲得提交郵件的正文。

最後,您將正文條目拆分爲多行,並找到以Change-Id開頭的行並將其解析。

#!/usr/bin/python 

GIT_COMMIT_FIELDS = ['id', 'author_name', 'author_email', 'date', 'message', 'body'] 
GIT_LOG_FORMAT = ['%H', '%an', '%ae', '%ad', '%s', '%b'] 
GIT_LOG_FORMAT = '%x1f'.join(GIT_LOG_FORMAT) + '%x1e' 

p = Popen('git log --format="%s"' % GIT_LOG_FORMAT, shell=True, stdout=PIPE) 
(log, _) = p.communicate() 
log = log.strip('\n\x1e').split("\x1e") 
log = [row.strip().split("\x1f") for row in log] 
log = [dict(zip(GIT_COMMIT_FIELDS, row)) for row in log] 

for row in log: 
    for line in row['body'].split("\n"): 
     if line.startswith('Change-Id:'): 
      row['changeId'] = line.split(':')[1].strip()