如何使用git log提取changeid --format =?

时间:2015-03-02 20:26:42

标签: git

我已经阅读了

的文档
  

git log --format

但是我没有看到使用命令git log --format提取Change-Id的方法(如下面的例子:Change-Id:Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b)。

$ git log -1

  commit 29a6bb1a059aef021ac39d342499191278518d1d

  Author: A. U. Thor <author@example.com>

  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 <author@example.com>
      CC: R. E. Viewer <reviewer@example.com>

有办法做到这一点吗?提前谢谢!

2 个答案:

答案 0 :(得分:4)

就git而言,没有更改ID。 (它只是邮件正文中的一行,git可以为您提供邮件正文,或者禁止邮件正文,但它不会为您提供单独的行 消息体。 1

要将git log的输出限制为仅限邮件正文,请使用%b。要将输出限制为仅限邮件主题,请使用%s。获得&#34;原始身体&#34; (主题+正文)使用%B

在任何情况下,您都需要一些外部程序来从消息体中截取有趣的行。正如其他人已经评论过的那样,grep非常适合这一点。


1 除非你计算第一行(主题,%s,部分)并且指的是&#34;原始身体&#34; (%B部分)当你说&#34; body&#34;。然后%s将为您提供第一行。像往常一样,这些描述有些模糊和松散,以至于当有人说“消息体”时#34;它经常值得澄清这意味着什么。 &#34;你的意思是原始的主体和身体,还是身体减去主体?&#34;这是使用实际格式指令(%s%b%B)真正闪耀的地方,因为这些是明确的。

答案 1 :(得分:0)

您想从http://blog.lost-theory.org/post/how-to-parse-git-log-output/

开始

然后将body标志的“%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()