Some workflows prefer to track exactly which email message was used to
generate a commit.  This can be used, for example, to generate an
automated acknowledgement when a patch is committed as a response to
the patch email, or as a reference to the thread which introduced the

Support this by adding a --message-id option (abbreviated as -m) to
git-am, which will then extract the message ID and append it to the
email commit log.

Signed-off-by: Avi Kivity <>
 Documentation/git-am.txt |  6 ++++++
 builtin/mailinfo.c       |  2 +-                | 10 +++++++++-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt
index 9adce37..8a251a1 100644
--- a/Documentation/git-am.txt
+++ b/Documentation/git-am.txt
@@ -15,6 +15,7 @@ SYNOPSIS
         [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
         [--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet]
         [--[no-]scissors] [-S[<keyid>]] [--patch-format=<format>]
+        [--message-id]
         [(<mbox> | <Maildir>)...]
 'git am' (--continue | --skip | --abort)
@@ -121,6 +122,11 @@ default.   You can use `--no-utf8` to override this.
        user to lie about the author date by using the same
        value as the committer date.
+       Extract the Message-Id: header from the e-mail and
+       append it to the commit message's tag stanza.
        Skip the current patch.  This is only meaningful when
        restarting an aborted patch.
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index cf11c8d..f1e1fed 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -278,7 +278,7 @@ static void cleanup_space(struct strbuf *sb)
 static void decode_header(struct strbuf *line);
 static const char *header[MAX_HDR_PARSED] = {
-       "From","Subject","Date",
+       "From","Subject","Date","Message-Id"
 static inline int cmp_header(const struct strbuf *line, const char *hdr)
diff --git a/ b/
index ee61a77..22799ff 100755
--- a/
+++ b/
@@ -39,6 +39,7 @@ committer-date-is-author-date    lie about committer date
 ignore-date     use current timestamp for author date
 rerere-autoupdate update the index with reused conflict resolution if possible
 S,gpg-sign?     GPG-sign commits
+m,message-id    copy the Message-Id: header to the commit's tag stanza
 rebasing*       (internal use for git-rebase)"
 . git-sh-setup
@@ -371,7 +372,7 @@ split_patches () {
 sign= utf8=t keep= keepcr= skip= interactive= resolved= rebasing= abort=
-resolvemsg= resume= scissors= no_inbody_headers=
+resolvemsg= resume= scissors= no_inbody_headers= message_id=
@@ -442,6 +443,8 @@ it will be removed. Please do not use it anymore."
                gpg_sign_opt=-S ;;
                gpg_sign_opt="-S${1#--gpg-sign=}" ;;
+       -m|--message-id)
+               message_id=t ;;
                shift; break ;;
@@ -565,6 +568,7 @@ Use \"git am --abort\" to remove it.")"
        echo " $git_apply_opt" >"$dotest/apply-opt"
        echo "$threeway" >"$dotest/threeway"
        echo "$sign" >"$dotest/sign"
+       echo "$message_id" > "$dotest/message-id"
        echo "$utf8" >"$dotest/utf8"
        echo "$keep" >"$dotest/keep"
        echo "$scissors" >"$dotest/scissors"
@@ -757,6 +761,10 @@ To restore the original branch and stop patching run 
\"\$cmdline --abort\"."
                        cat "$dotest/msg-clean"
+               if test 't' == "$message_id"
+               then
+                       grep ^Message-Id: "$dotest/info"
+               fi
                if test '' != "$ADD_SIGNOFF"
                        echo "$ADD_SIGNOFF"

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to