Documentation / git-for-each-ref.txton commit hash-object: cleanup handling of command line options (8a2f5e5)
   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
 103As a special case for the date-type fields, you may specify a format for
 104the date by adding one of `:default`, `:relative`, `:short`, `:local`,
 105`:iso8601` or `:rfc2822` to the end of the fieldname; e.g.
 106`%(taggerdate:relative)`.
 107
 108
 109EXAMPLES
 110--------
 111
 112An example directly producing formatted text.  Show the most recent
 1133 tagged commits::
 114
 115------------
 116#!/bin/sh
 117
 118git-for-each-ref --count=3 --sort='-*authordate' \
 119--format='From: %(*authorname) %(*authoremail)
 120Subject: %(*subject)
 121Date: %(*authordate)
 122Ref: %(*refname)
 123
 124%(*body)
 125' 'refs/tags'
 126------------
 127
 128
 129A simple example showing the use of shell eval on the output,
 130demonstrating the use of --shell.  List the prefixes of all heads::
 131------------
 132#!/bin/sh
 133
 134git-for-each-ref --shell --format="ref=%(refname)" refs/heads | \
 135while read entry
 136do
 137        eval "$entry"
 138        echo `dirname $ref`
 139done
 140------------
 141
 142
 143A bit more elaborate report on tags, demonstrating that the format
 144may be an entire script::
 145------------
 146#!/bin/sh
 147
 148fmt='
 149        r=%(refname)
 150        t=%(*objecttype)
 151        T=${r#refs/tags/}
 152
 153        o=%(*objectname)
 154        n=%(*authorname)
 155        e=%(*authoremail)
 156        s=%(*subject)
 157        d=%(*authordate)
 158        b=%(*body)
 159
 160        kind=Tag
 161        if test "z$t" = z
 162        then
 163                # could be a lightweight tag
 164                t=%(objecttype)
 165                kind="Lightweight tag"
 166                o=%(objectname)
 167                n=%(authorname)
 168                e=%(authoremail)
 169                s=%(subject)
 170                d=%(authordate)
 171                b=%(body)
 172        fi
 173        echo "$kind $T points at a $t object $o"
 174        if test "z$t" = zcommit
 175        then
 176                echo "The commit was authored by $n $e
 177at $d, and titled
 178
 179    $s
 180
 181Its message reads as:
 182"
 183                echo "$b" | sed -e "s/^/    /"
 184                echo
 185        fi
 186'
 187
 188eval=`git-for-each-ref --shell --format="$fmt" \
 189        --sort='*objecttype' \
 190        --sort=-taggerdate \
 191        refs/tags`
 192eval "$eval"
 193------------