Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the format string for `git reflog` default output?

Tags:

git

I want to tweak the default output of git reflog, but I first need the format string to reproduce the default output. Specifically, I'm having trouble with the coloring of the different refnames:

git-reflog

Can someone more knowledgable with Git help me out?

like image 824
Dan Li Avatar asked Aug 18 '17 21:08

Dan Li


People also ask

What is the default setting of git Reflog?

By default, the reflog expiration date is set to 90 days. An expire time can be specified by passing a command line argument --expire=time to git reflog expire or by setting a git configuration name of gc. reflogExpire .

What is the default setting of git Reflog when no subcommands are specified?

The "show" subcommand (which is also the default, in the absence of any subcommands) shows the log of the reference provided in the command-line (or HEAD , by default). The reflog covers all recent actions, and in addition the HEAD reflog records branch switching.

What is the output of git log -- pretty Oneline?

Under --pretty=oneline , the commit message is prefixed with this information on the same line. This option cannot be combined with --reverse . See also git-reflog[1]. Under --pretty=reference , this information will not be shown at all.


2 Answers

The default format string for reflog is something like this:

git reflog --format='%C(auto)%h %gd: %gs (%s)'

Colors can be modified with %C. For example, to change the initial yellow to magenta:

git reflog --format='%C(magenta)%h%C(reset) %gd: %gs (%s)'

Note that %C(reset) is absolutely necessary because coloring is achieved using ANSI escape sequences and they must be correctly terminated. If you're curios look into color.h in git code to see how these sequences look like.

For all possible format strings see format:<string> in man git-log:

   ·   format:<string>

       The format:<string> format allows you to specify which information you want to show. It works a little
       bit like printf format, with the notable exception that you get a newline with %n instead of \n.

       E.g, format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" would show something like this:

           The author of fe6e0ee was Junio C Hamano, 23 hours ago
           The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<

       The placeholders are:

       ·   %H: commit hash

       ·   %h: abbreviated commit hash

       ·   %T: tree hash

       ·   %t: abbreviated tree hash

       ·   %P: parent hashes

       ·   %p: abbreviated parent hashes

       ·   %an: author name

       ·   %aN: author name (respecting .mailmap, see git-shortlog(1) or git-blame(1))

       ·   %ae: author email

       ·   %aE: author email (respecting .mailmap, see git-shortlog(1) or git-blame(1))

       ·   %ad: author date (format respects --date= option)

       ·   %aD: author date, RFC2822 style

       ·   %ar: author date, relative

       ·   %at: author date, UNIX timestamp

       ·   %ai: author date, ISO 8601-like format

       ·   %aI: author date, strict ISO 8601 format

       ·   %cn: committer name

       ·   %cN: committer name (respecting .mailmap, see git-shortlog(1) or git-blame(1))

       ·   %ce: committer email

       ·   %cE: committer email (respecting .mailmap, see git-shortlog(1) or git-blame(1))

       ·   %cd: committer date (format respects --date= option)

       ·   %cD: committer date, RFC2822 style

       ·   %cr: committer date, relative

       ·   %ct: committer date, UNIX timestamp

       ·   %ci: committer date, ISO 8601-like format

       ·   %cI: committer date, strict ISO 8601 format

       ·   %d: ref names, like the --decorate option of git-log(1)

       ·   %D: ref names without the " (", ")" wrapping.

       ·   %e: encoding

       ·   %s: subject

       ·   %f: sanitized subject line, suitable for a filename

       ·   %b: body

       ·   %B: raw body (unwrapped subject and body)

       ·   %N: commit notes

       ·   %GG: raw verification message from GPG for a signed commit

       ·   %G?: show "G" for a good (valid) signature, "B" for a bad signature, "U" for a good signature with
           unknown validity and "N" for no signature

       ·   %GS: show the name of the signer for a signed commit

       ·   %GK: show the key used to sign a signed commit

       ·   %gD: reflog selector, e.g., refs/stash@{1}

       ·   %gd: shortened reflog selector, e.g., stash@{1}

       ·   %gn: reflog identity name

       ·   %gN: reflog identity name (respecting .mailmap, see git-shortlog(1) or git-blame(1))

       ·   %ge: reflog identity email

       ·   %gE: reflog identity email (respecting .mailmap, see git-shortlog(1) or git-blame(1))

       ·   %gs: reflog subject

       ·   %Cred: switch color to red

       ·   %Cgreen: switch color to green

       ·   %Cblue: switch color to blue

       ·   %Creset: reset color

       ·   %C(...): color specification, as described in color.branch.* config option; adding auto, at the
           beginning will emit color only when colors are enabled for log output (by color.diff, color.ui, or
           --color, and respecting the auto settings of the former if we are going to a terminal).  auto
           alone (i.e.  %C(auto)) will turn on auto coloring on the next placeholders until the color is
           switched again.

       ·   %m: left, right or boundary mark

       ·   %n: newline

       ·   %%: a raw %

       ·   %x00: print a byte from a hex code

       ·   %w([<w>[,<i1>[,<i2>]]]): switch line wrapping, like the -w option of git-shortlog(1).

       ·   %<(<N>[,trunc|ltrunc|mtrunc]): make the next placeholder take at least N columns, padding spaces
           on the right if necessary. Optionally truncate at the beginning (ltrunc), the middle (mtrunc) or
           the end (trunc) if the output is longer than N columns. Note that truncating only works correctly
           with N >= 2.

       ·   %<|(<N>): make the next placeholder take at least until Nth columns, padding spaces on the right
           if necessary

       ·   %>(<N>), %>|(<N>): similar to %<(<N>), %<|(<N>) respectively, but padding spaces on the left

       ·   %>>(<N>), %>>|(<N>): similar to %>(<N>), %>|(<N>) respectively, except that if the next
           placeholder takes more spaces than given and there are spaces on its left, use those spaces

       ·   %><(<N>), %><|(<N>): similar to % <(<N>), %<|(<N>) respectively, but padding both sides (i.e. the
           text is centered)
like image 93
Arkadiusz Drabczyk Avatar answered Oct 10 '22 20:10

Arkadiusz Drabczyk


Per the git reflog documentation:

git reflog show is an alias for git log -g --abbrev-commit --pretty=oneline

which should then send you to the git log documentation, which says little about --pretty=oneline, but hides an important bit under the -g aka --walk-reflogs description:

With --pretty format other than oneline (for obvious reasons), this causes the output to have two extra lines of information taken from the reflog. The reflog designator in the output may be shown as ref@{Nth} (where Nth is the reverse-chronological index in the reflog) or as ref@{timestamp} (with the timestamp for that entry), depending on a few rules:

  1. If the starting point is specified as ref@{Nth}, show the index format.

  2. If the starting point was specified as ref@{now}, show the timestamp format.

  3. If neither was used, but --date was given on the command line, show the timestamp in the format requested by --date.

  4. Otherwise, show the index format.

Under --pretty=oneline, the commit message is prefixed with this information on the same line. This option cannot be combined with --reverse. See also git-reflog(1).

The "starting point" this alludes to is which reflog entry you gave with your git log -g command. If you did not give one, git log defaults to HEAD, which doesn't have either format, so this falls into rule 3 or 4:

git log --pretty=oneline -g HEAD@{now}

explicitly uses rule 2, but:

git log --pretty=oneline -g HEAD@{0}

explicitly uses rule 1, for instance.

The little it says, or doesn't say, about --pretty=oneline is that it is roughly equivalent to %H %gd %s or %h %gd %s depending on whether you use --abbrev-commit. But—this also is somewhat missing from the documentation—if you set log.decorate=auto in your configuration and stdout is going to an interactive device,1 you also get %d inserted.


1"Interactive device" is whatever is designated a "tty" by the C library isatty function.

like image 28
torek Avatar answered Oct 10 '22 20:10

torek