| git-for-each-ref(1) | |
| =================== | |
| NAME | |
| ---- | |
| git-for-each-ref - Output information on each ref | |
| SYNOPSIS | |
| -------- | |
| [synopsis] | |
| git for-each-ref [--count=<count>] [--shell|--perl|--python|--tcl] | |
| [(--sort=<key>)...] [--format=<format>] | |
| [--include-root-refs] [--points-at=<object>] | |
| [--merged[=<object>]] [--no-merged[=<object>]] | |
| [--contains[=<object>]] [--no-contains[=<object>]] | |
| [(--exclude=<pattern>)...] [--start-after=<marker>] | |
| [ --stdin | (<pattern>...)] | |
| DESCRIPTION | |
| ----------- | |
| Iterate over all refs that match _<pattern>_ and show them | |
| according to the given _<format>_, after sorting them according | |
| to the given set of _<key>_. If _<count>_ is given, stop after | |
| showing that many refs. The interpolated values in _<format>_ | |
| can optionally be quoted as string literals in the specified | |
| host language allowing their direct evaluation in that language. | |
| OPTIONS | |
| ------- | |
| include::for-each-ref-options.adoc[] | |
| FIELD NAMES | |
| ----------- | |
| Various values from structured fields in referenced objects can | |
| be used to interpolate into the resulting output, or as sort | |
| keys. | |
| For all objects, the following names can be used: | |
| `refname`:: | |
| The name of the ref (the part after `$GIT_DIR/`). | |
| For a non-ambiguous short name of the ref append `:short`. | |
| The option `core.warnAmbiguousRefs` is used to select the strict | |
| abbreviation mode. If `lstrip=<n>` (`rstrip=<n>`) is appended, strip _<n>_ | |
| slash-separated path components from the front (back) of the refname | |
| (e.g. `%(refname:lstrip=2)` turns `refs/tags/foo` into `foo` and | |
| `%(refname:rstrip=2)` turns `refs/tags/foo` into `refs`). | |
| If _<n>_ is a negative number, strip as many path components as | |
| necessary from the specified end to leave `-<n>` path components | |
| (e.g. `%(refname:lstrip=-2)` turns | |
| `refs/tags/foo` into `tags/foo` and `%(refname:rstrip=-1)` | |
| turns `refs/tags/foo` into `refs`). When the ref does not have | |
| enough components, the result becomes an empty string if | |
| stripping with positive _<n>_, or it becomes the full refname if | |
| stripping with negative _<N>_. Neither is an error. | |
| + | |
| `strip` can be used as a synonym to `lstrip`. | |
| `objecttype`:: | |
| The type of the object (`blob`, `tree`, `commit`, `tag`). | |
| `objectsize`:: | |
| The size of the object (the same as 'git cat-file -s' reports). | |
| Append `:disk` to get the size, in bytes, that the object takes up on | |
| disk. See the note about on-disk sizes in the | |
| <<CAVEATS,'CAVEATS'>> section below. | |
| `objectname`:: | |
| The object name (aka SHA-1). | |
| For a non-ambiguous abbreviation of the object name append `:short`. | |
| For an abbreviation of the object name with desired length append | |
| `:short=<length>`, where the minimum length is `MINIMUM_ABBREV`. The | |
| length may be exceeded to ensure unique object names. | |
| `deltabase`:: | |
| This expands to the object name of the delta base for the | |
| given object, if it is stored as a delta. Otherwise it | |
| expands to the null object name (all zeroes). | |
| `upstream`:: | |
| The name of a local ref which can be considered ``upstream'' | |
| from the displayed ref. Respects `:short`, `:lstrip` and | |
| `:rstrip` in the same way as `refname` above. Additionally | |
| respects `:track` to show "[ahead N, behind M]" and | |
| `:trackshort` to show the terse version: ">" (ahead), "<" | |
| (behind), "<>" (ahead and behind), or "=" (in sync). `:track` | |
| also prints "[gone]" whenever unknown upstream ref is | |
| encountered. Append `:track,nobracket` to show tracking | |
| information without brackets (i.e "ahead N, behind M"). | |
| + | |
| For any remote-tracking branch `%(upstream)`, `%(upstream:remotename)` | |
| and `%(upstream:remoteref)` refer to the name of the remote and the | |
| name of the tracked remote ref, respectively. In other words, the | |
| remote-tracking branch can be updated explicitly and individually by | |
| using the refspec `%(upstream:remoteref):%(upstream)` to fetch from | |
| `%(upstream:remotename)`. | |
| + | |
| Has no effect if the ref does not have tracking information associated | |
| with it. All the options apart from `nobracket` are mutually exclusive, | |
| but if used together the last option is selected. | |
| `push`:: | |
| The name of a local ref which represents the `@{push}` | |
| location for the displayed ref. Respects `:short`, `:lstrip`, | |
| `:rstrip`, `:track`, `:trackshort`, `:remotename`, and `:remoteref` | |
| options as `upstream` does. Produces an empty string if no `@{push}` | |
| ref is configured. | |
| `HEAD`:: | |
| `*` if `HEAD` matches current ref (the checked out branch), ' ' | |
| otherwise. | |
| `color`:: | |
| Change output color. Followed by `:<colorname>`, where color | |
| names are described under Values in the "CONFIGURATION FILE" | |
| section of linkgit:git-config[1]. For example, | |
| `%(color:bold red)`. | |
| `align`:: | |
| Left-, middle-, or right-align the content between | |
| `%(align:...)` and `%(end)`. The "`align:`" is followed by | |
| `width=<width>` and `position=<position>` in any order | |
| separated by a comma, where the _<position>_ is either `left`, | |
| `right` or `middle`, default being `left` and _<width>_ is the total | |
| length of the content with alignment. For brevity, the | |
| "width=" and/or "position=" prefixes may be omitted, and bare | |
| _<width>_ and _<position>_ used instead. For instance, | |
| `%(align:<width>,<position>)`. If the contents length is more | |
| than the width then no alignment is performed. If used with | |
| `--quote` everything in between `%(align:...)` and `%(end)` is | |
| quoted, but if nested then only the topmost level performs | |
| quoting. | |
| `if`:: | |
| Used as `%(if)...%(then)...%(end)` or | |
| `%(if)...%(then)...%(else)...%(end)`. If there is an atom with | |
| value or string literal after the `%(if)` then everything after | |
| the `%(then)` is printed, else if the `%(else)` atom is used, then | |
| everything after %(else) is printed. We ignore space when | |
| evaluating the string before `%(then)`, this is useful when we | |
| use the `%(HEAD)` atom which prints either "`*`" or " " and we | |
| want to apply the 'if' condition only on the `HEAD` ref. | |
| Append "`:equals=<string>`" or "`:notequals=<string>`" to compare | |
| the value between the `%(if:...)` and `%(then)` atoms with the | |
| given string. | |
| `symref`:: | |
| The ref which the given symbolic ref refers to. If not a | |
| symbolic ref, nothing is printed. Respects the `:short`, | |
| `:lstrip` and `:rstrip` options in the same way as `refname` | |
| above. | |
| `signature`:: | |
| The GPG signature of a commit. | |
| `signature:grade`:: | |
| Show | |
| `G`;; for a good (valid) signature | |
| `B`;; for a bad signature | |
| `U`;; for a good signature with unknown validity | |
| `X`;; for a good signature that has expired | |
| `Y`;; for a good signature made by an expired key | |
| `R`;; for a good signature made by a revoked key | |
| `E`;; if the signature cannot be checked (e.g. missing key) | |
| `N`;; for no signature. | |
| `signature:signer`:: | |
| The signer of the GPG signature of a commit. | |
| `signature:key`:: | |
| The key of the GPG signature of a commit. | |
| `signature:fingerprint`:: | |
| The fingerprint of the GPG signature of a commit. | |
| `signature:primarykeyfingerprint`:: | |
| The primary key fingerprint of the GPG signature of a commit. | |
| `signature:trustlevel`:: | |
| The trust level of the GPG signature of a commit. Possible | |
| outputs are `ultimate`, `fully`, `marginal`, `never` and `undefined`. | |
| `worktreepath`:: | |
| The absolute path to the worktree in which the ref is checked | |
| out, if it is checked out in any linked worktree. Empty string | |
| otherwise. | |
| `ahead-behind:<commit-ish>`:: | |
| Two integers, separated by a space, demonstrating the number of | |
| commits ahead and behind, respectively, when comparing the output | |
| ref to the _<committish>_ specified in the format. | |
| `is-base:<commit-ish>`:: | |
| In at most one row, `(<commit-ish>)` will appear to indicate the ref | |
| that is most likely the ref used as a starting point for the branch | |
| that produced _<commit-ish>_. This choice is made using a heuristic: | |
| choose the ref that minimizes the number of commits in the | |
| first-parent history of _<commit-ish>_ and not in the first-parent | |
| history of the ref. | |
| + | |
| For example, consider the following figure of first-parent histories of | |
| several refs: | |
| + | |
| ---- | |
| *--*--*--*--*--* refs/heads/A | |
| \ | |
| \ | |
| *--*--*--* refs/heads/B | |
| \ \ | |
| \ \ | |
| * * refs/heads/C | |
| \ | |
| \ | |
| *--* refs/heads/D | |
| ---- | |
| + | |
| Here, if `A`, `B`, and `C` are the filtered references, and the format | |
| string is `%(refname):%(is-base:D)`, then the output would be | |
| + | |
| ---- | |
| refs/heads/A: | |
| refs/heads/B:(D) | |
| refs/heads/C: | |
| ---- | |
| + | |
| This is because the first-parent history of `D` has its earliest | |
| intersection with the first-parent histories of the filtered refs at a | |
| common first-parent ancestor of `B` and `C` and ties are broken by the | |
| earliest ref in the sorted order. | |
| + | |
| Note that this token will not appear if the first-parent history of | |
| _<commit-ish>_ does not intersect the first-parent histories of the | |
| filtered refs. | |
| `describe[:<option>,...]`:: | |
| A human-readable name, like linkgit:git-describe[1]; | |
| empty string for undescribable commits. The `describe` string may | |
| be followed by a colon and one or more comma-separated options. | |
| + | |
| -- | |
| `tags=<bool-value>`;; | |
| Instead of only considering annotated tags, consider | |
| lightweight tags as well; see the corresponding option in | |
| linkgit:git-describe[1] for details. | |
| `abbrev=<number>`;; | |
| Use at least _<number>_ hexadecimal digits; see the corresponding | |
| option in linkgit:git-describe[1] for details. | |
| `match=<pattern>`;; | |
| Only consider tags matching the `glob`(7) _<pattern>_, | |
| excluding the `refs/tags/` prefix; see the corresponding option | |
| in linkgit:git-describe[1] for details. | |
| `exclude=<pattern>`;; | |
| Do not consider tags matching the `glob`(7) _<pattern>_, | |
| excluding the `refs/tags/` prefix; see the corresponding option | |
| in linkgit:git-describe[1] for details. | |
| -- | |
| In addition to the above, for commit and tag objects, the header | |
| field names (`tree`, `parent`, `object`, `type`, and `tag`) can | |
| be used to specify the value in the header field. | |
| Fields `tree` and `parent` can also be used with modifier `:short` and | |
| `:short=<length>` just like `objectname`. | |
| For commit and tag objects, the special `creatordate` and `creator` | |
| fields will correspond to the appropriate date or name-email-date tuple | |
| from the `committer` or `tagger` fields depending on the object type. | |
| These are intended for working on a mix of annotated and lightweight tags. | |
| For tag objects, a `fieldname` prefixed with an asterisk (`*`) expands to | |
| the `fieldname` value of the peeled object, rather than that of the tag | |
| object itself. | |
| Fields that have name-email-date tuple as its value (`author`, | |
| `committer`, and `tagger`) can be suffixed with `name`, `email`, | |
| and `date` to extract the named component. For email fields (`authoremail`, | |
| `committeremail` and `taggeremail`), `:trim` can be appended to get the email | |
| without angle brackets, and `:localpart` to get the part before the `@` symbol | |
| out of the trimmed email. In addition to these, the `:mailmap` option and the | |
| corresponding `:mailmap,trim` and `:mailmap,localpart` can be used (order does | |
| not matter) to get values of the name and email according to the .mailmap file | |
| or according to the file set in the mailmap.file or mailmap.blob configuration | |
| variable (see linkgit:gitmailmap[5]). | |
| The raw data in an object is `raw`. | |
| `raw:size`:: | |
| The raw data size of the object. | |
| Note that `--format=%(raw)` can not be used with `--python`, `--shell`, `--tcl`, | |
| because such language may not support arbitrary binary data in their string | |
| variable type. | |
| The message in a commit or a tag object is `contents`, from which | |
| `contents:<part>` can be used to extract various parts out of: | |
| `contents:size`:: | |
| The size in bytes of the commit or tag message. | |
| `contents:subject`:: | |
| The first paragraph of the message, which typically is a | |
| single line, is taken as the "subject" of the commit or the | |
| tag message. | |
| Instead of `contents:subject`, field `subject` can also be used to | |
| obtain same results. `:sanitize` can be appended to `subject` for | |
| subject line suitable for filename. | |
| `contents:body`:: | |
| The remainder of the commit or the tag message that follows | |
| the "subject". | |
| `contents:signature`:: | |
| The optional GPG signature of the tag. | |
| `contents:lines=<n>`:: | |
| The first _<n>_ lines of the message. | |
| Additionally, the trailers as interpreted by linkgit:git-interpret-trailers[1] | |
| are obtained as `trailers[:<option>,...]` (or by using the historical alias | |
| `contents:trailers[:<option>,...]`). For valid _<option>_ values see `trailers` | |
| section of linkgit:git-log[1]. | |
| For sorting purposes, fields with numeric values sort in numeric order | |
| (`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`). | |
| All other fields are used to sort in their byte-value order. | |
| There is also an option to sort by versions, this can be done by using | |
| the fieldname `version:refname` or its alias `v:refname`. | |
| In any case, a field name that refers to a field inapplicable to | |
| the object referred by the ref does not cause an error. It | |
| returns an empty string instead. | |
| As a special case for the date-type fields, you may specify a format for the | |
| date by adding `:` followed by date format name (see the values the `--date` | |
| option to linkgit:git-rev-list[1] takes). If this formatting is provided in | |
| a `--sort` key, references will be sorted according to the byte-value of the | |
| formatted string rather than the numeric value of the underlying timestamp. | |
| Some atoms like `%(align)` and `%(if)` always require a matching `%(end)`. | |
| We call them "opening atoms" and sometimes denote them as `%($open)`. | |
| When a scripting language specific quoting is in effect, everything | |
| between a top-level opening atom and its matching %(end) is evaluated | |
| according to the semantics of the opening atom and only its result | |
| from the top-level is quoted. | |
| EXAMPLES | |
| -------- | |
| An example directly producing formatted text. Show the most recent | |
| 3 tagged commits: | |
| ------------ | |
| #!/bin/sh | |
| git for-each-ref --count=3 --sort='-*authordate' \ | |
| `--format='From: %(*authorname) %(*authoremail) | |
| Subject: %(*subject) | |
| Date: %(*authordate) | |
| Ref: %(*refname) | |
| %(*body) | |
| ' 'refs/tags' | |
| ------------ | |
| A simple example showing the use of shell eval on the output, | |
| demonstrating the use of `--shell`. List the prefixes of all heads: | |
| ------------ | |
| #!/bin/sh | |
| git for-each-ref --shell --format="ref=%(refname)" refs/heads | \ | |
| while read entry | |
| do | |
| eval "$entry" | |
| echo `dirname $ref` | |
| done | |
| ------------ | |
| A bit more elaborate report on tags, demonstrating that the format | |
| may be an entire script: | |
| ------------ | |
| #!/bin/sh | |
| fmt=' | |
| r=%(refname) | |
| t=%(*objecttype) | |
| T=${r#refs/tags/} | |
| o=%(*objectname) | |
| n=%(*authorname) | |
| e=%(*authoremail) | |
| s=%(*subject) | |
| d=%(*authordate) | |
| b=%(*body) | |
| kind=Tag | |
| if test "z$t" = z | |
| then | |
| # could be a lightweight tag | |
| t=%(objecttype) | |
| kind="Lightweight tag" | |
| o=%(objectname) | |
| n=%(authorname) | |
| e=%(authoremail) | |
| s=%(subject) | |
| d=%(authordate) | |
| b=%(body) | |
| fi | |
| echo "$kind $T points at a $t object $o" | |
| if test "z$t" = zcommit | |
| then | |
| echo "The commit was authored by $n $e | |
| at $d, and titled | |
| $s | |
| Its message reads as: | |
| " | |
| echo "$b" | sed -e "s/^/ /" | |
| echo | |
| fi | |
| ' | |
| eval=`git for-each-ref --shell --format="$fmt" \ | |
| --sort='*objecttype' \ | |
| --sort=-taggerdate \ | |
| refs/tags` | |
| eval "$eval" | |
| ------------ | |
| An example to show the usage of `%(if)...%(then)...%(else)...%(end)`. | |
| This prefixes the current branch with a star. | |
| ------------ | |
| git for-each-ref --format="%(if)%(HEAD)%(then)* %(else) %(end)%(refname:short)" refs/heads/ | |
| ------------ | |
| An example to show the usage of `%(if)...%(then)...%(end)`. | |
| This prints the authorname, if present. | |
| ------------ | |
| git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Authored by: %(authorname)%(end)" | |
| ------------ | |
| [[CAVEATS]] | |
| CAVEATS | |
| ------- | |
| Note that the sizes of objects on disk are reported accurately, but care | |
| should be taken in drawing conclusions about which refs or objects are | |
| responsible for disk usage. The size of a packed non-delta object may be | |
| much larger than the size of objects which delta against it, but the | |
| choice of which object is the base and which is the delta is arbitrary | |
| and is subject to change during a repack. | |
| Note also that multiple copies of an object may be present in the object | |
| database; in this case, it is undefined which copy's size or delta base | |
| will be reported. | |
| NOTES | |
| ----- | |
| include::ref-reachability-filters.adoc[] | |
| SEE ALSO | |
| -------- | |
| linkgit:git-show-ref[1] | |
| GIT | |
| --- | |
| Part of the linkgit:git[1] suite |