开发者

How to make git log not prompt to continue?

开发者 https://www.devze.com 2023-04-12 05:13 出处:网络
I have a couple of git repositories that belong together, and simple batch/bash file to loop over them. I often loop over them with a log command to quickly see what state they are in. This works nice

I have a couple of git repositories that belong together, and simple batch/bash file to loop over them. I often loop over them with a log command to quickly see what state they are in. This works nicely, except for one thing: if the commit message is longer than the number of characters my console is wide (or has multiple lines), git shows the line, then a newline with (END) and I have to press q to continue (I guess it pipes the output through more or something like that). Example:

> gitloop . "git log --decorate=short --pretty=oneline -n1"
18629ae238e9d5832cb3535ec88274173337a501 (HEAD, origin/master, master) short log

625fb891b9b0b8648459b07ace662ae3b7773c7f (HEAD, origin/master, origin/HEAD, master) short log

dc0838118266ba8570ea338c1faddfe8af0387bb (HEAD, origin/work, origin/master, work, master) oops loooooooooooooong log
-(END)

This is rather i开发者_开发百科nconvenient as I have to press q a couple of time, whereas I'd just like to see all those oneliners in one go.

How can I disable this behaviour (preferrably while still keeping this log format)?


Git has an option to disable the pager:

git --no-pager log --decorate=short --pretty=oneline -n1

If your pager cuts lines and you want to retain that behaviour, either pipe to cut...

git --no-pager log --decorate=short --pretty=oneline -n1 | cut -c 1-$COLUMNS

...or set the environment variable GIT_PAGER before the invocation:

GIT_PAGER="cut -c 1-${COLUMNS-80}" git log --decorate=short --pretty=oneline -n1


Another solution for the problem of permanently disabling pager specifically when using log subcommand:

  • for current repo only:
    git config pager.log false

  • for your git installation (i. e. all repos on your machine):
    git config --global pager.log false

As you can guess, the same works if pager is needed to be on or off for some other subcommands selectively.
E. g. for branch (which prints branches) subcommand it will be

git config pager.branch false


Proposed solution is arguably more elegant comparing to

  • using git --no-pager each time you run certain command.
    Because, quite possible, you don't want to type it each time.

  • specifying git --no-pager as an alias for git
    Because, quite possible, you want to avoid implicit global config OR you want pager to be enabled in some cases.

  • rely on some environment variables like PAGER or GIT_PAGER.
    Because to do that, you need to ensure they're set in your current terminal session. And, if you want them to be set to some custom value automatically each time your new terminal is created, you need to alter one of shell-bootstrapped files like e. g. ~/.bashrc. It's not a big problem. But these bootstrapped files frequently are altered by other applications as well and contain bunch of other stuff, not just that used by Git. So, in theory, it's better to specify git-related settings using git config rather than put them in e. g. ~/.bashrc.


The alternative solution for disabling pager for all subcommands is to specify cat as the utility git will use for paging:

  • git config core.pager cat OR
  • git config --global core.pager cat

My answer is somewhat rephrasing of the one below:
"prevent git diff from using a pager?"
https://stackoverflow.com/a/6986231/6103242

It's referenced to point out another relevant discussion.


Disable pager for all commands:

git config --global core.pager '' 


You pipe it to less -F in case --no-pager does not work for you.

git log --decorate --oneline -5 | less -F

-F means that less will behave like --no-pager if the output fits on one screen, but become a pager otherwise.


export PAGER=cat

worked for me


Although the above answers are probably correct, I would like add one that suites me best. I recommend configure less instead of git by adding the following flags:

export LESS="${LESS:+$LESS }-X -F"
-X  Disables sending the termcap initialization and deinitialization strings to the terminal.
-F or --quit-if-one-screen -> no need to press `q` if output fits into the current terminal size.
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号