Documentation / git-for-each-ref.txton commit Documentation: Add definition of "evil merge" to GIT Glossary (c1bab28)
   1git-for-each-ref(1)
   2===================
   3
   4NAME
   5----
   6git-for-each-ref - Output information on each ref
   7
   8SYNOPSIS
   9--------
  10[verse]
  11'git-for-each-ref' [--count=<count>]\*
  12                   [--shell|--perl|--python|--tcl]
  13                   [--sort=<key>]\* [--format=<format>] [<pattern>]
  14
  15DESCRIPTION
  16-----------
  17
  18Iterate over all refs that match `<pattern>` and show them
  19according to the given `<format>`, after sorting them according
  20to the given set of `<key>`.  If `<max>` is given, stop after
  21showing that many refs.  The interpolated values in `<format>`
  22can optionally be quoted as string literals in the specified
  23host language allowing their direct evaluation in that language.
  24
  25OPTIONS
  26-------
  27<count>::
  28        By default the command shows all refs that match
  29        `<pattern>`.  This option makes it stop after showing
  30        that many refs.
  31
  32<key>::
  33        A field name to sort on.  Prefix `-` to sort in
  34        descending order of the value.  When unspecified,
  35        `refname` is used.  More than one sort keys can be
  36        given.
  37
  38<format>::
  39        A string that interpolates `%(fieldname)` from the
  40        object pointed at by a ref being shown.  If `fieldname`
  41        is prefixed with an asterisk (`*`) and the ref points
  42        at a tag object, the value for the field in the object
  43        tag refers is used.  When unspecified, defaults to
  44        `%(objectname) SPC %(objecttype) TAB %(refname)`.
  45        It also interpolates `%%` to `%`, and `%xx` where `xx`
  46        are hex digits interpolates to character with hex code
  47        `xx`; for example `%00` interpolates to `\0` (NUL),
  48        `%09` to `\t` (TAB) and `%0a` to `\n` (LF).
  49
  50<pattern>::
  51        If given, the name of the ref is matched against this
  52        using fnmatch(3).  Refs that do not match the pattern
  53        are not shown.
  54
  55--shell, --perl, --python, --tcl::
  56        If given, strings that substitute `%(fieldname)`
  57        placeholders are quoted as string literals suitable for
  58        the specified host language.  This is meant to produce
  59        a scriptlet that can directly be `eval`ed.
  60
  61
  62FIELD NAMES
  63-----------
  64
  65Various values from structured fields in referenced objects can
  66be used to interpolate into the resulting output, or as sort
  67keys.
  68
  69For all objects, the following names can be used:
  70
  71refname::
  72        The name of the ref (the part after $GIT_DIR/).
  73
  74objecttype::
  75        The type of the object (`blob`, `tree`, `commit`, `tag`).
  76
  77objectsize::
  78        The size of the object (the same as `git-cat-file -s` reports).
  79
  80objectname::
  81        The object name (aka SHA-1).
  82
  83In addition to the above, for commit and tag objects, the header
  84field names (`tree`, `parent`, `object`, `type`, and `tag`) can
  85be used to specify the value in the header field.
  86
  87Fields that have name-email-date tuple as its value (`author`,
  88`committer`, and `tagger`) can be suffixed with `name`, `email`,
  89and `date` to extract the named component.
  90
  91The first line of the message in a commit and tag object is
  92`subject`, the remaining lines are `body`.  The whole message
  93is `contents`.
  94
  95For sorting purposes, fields with numeric values sort in numeric
  96order (`objectsize`, `authordate`, `committerdate`, `taggerdate`).
  97All other fields are used to sort in their byte-value order.
  98
  99In any case, a field name that refers to a field inapplicable to
 100the object referred by the ref does not cause an error.  It
 101returns an empty string instead.
 102
 103
 104EXAMPLES
 105--------
 106
 107An example directly producing formatted text.  Show the most recent
 1083 tagged commits::
 109
 110------------
 111#!/bin/sh
 112
 113git-for-each-ref --count=3 --sort='-*authordate' \
 114--format='From: %(*authorname) %(*authoremail)
 115Subject: %(*subject)
 116Date: %(*authordate)
 117Ref: %(*refname)
 118
 119%(*body)
 120' 'refs/tags'
 121------------
 122
 123
 124A simple example showing the use of shell eval on the output,
 125demonstrating the use of --shell.  List the prefixes of all heads::
 126------------
 127#!/bin/sh
 128
 129git-for-each-ref --shell --format="ref=%(refname)" refs/heads | \
 130while read entry
 131do
 132        eval "$entry"
 133        echo `dirname $ref`
 134done
 135------------
 136
 137
 138A bit more elaborate report on tags, demonstrating that the format
 139may be an entire script::
 140------------
 141#!/bin/sh
 142
 143fmt='
 144        r=%(refname)
 145        t=%(*objecttype)
 146        T=${r#refs/tags/}
 147
 148        o=%(*objectname)
 149        n=%(*authorname)
 150        e=%(*authoremail)
 151        s=%(*subject)
 152        d=%(*authordate)
 153        b=%(*body)
 154
 155        kind=Tag
 156        if test "z$t" = z
 157        then
 158                # could be a lightweight tag
 159                t=%(objecttype)
 160                kind="Lightweight tag"
 161                o=%(objectname)
 162                n=%(authorname)
 163                e=%(authoremail)
 164                s=%(subject)
 165                d=%(authordate)
 166                b=%(body)
 167        fi
 168        echo "$kind $T points at a $t object $o"
 169        if test "z$t" = zcommit
 170        then
 171                echo "The commit was authored by $n $e
 172at $d, and titled
 173
 174    $s
 175
 176Its message reads as:
 177"
 178                echo "$b" | sed -e "s/^/    /"
 179                echo
 180        fi
 181'
 182
 183eval=`git-for-each-ref --shell --format="$fmt" \
 184        --sort='*objecttype' \
 185        --sort=-taggerdate \
 186        refs/tags`
 187eval "$eval"
 188------------