更改git日志别名的寻呼机

时间:2016-10-31 03:55:17

标签: git

在我的.gitconfig中,我将别名设置为lol以运行以下命令:

git --no-pager log --graph --pretty=oneline --abbrev-commit --decorate --all $*

我在another post中读到我不应该使用no-pager,因此我使用了将寻呼机设置为cat的方法,如下所示。

我期待别名的输出与上面命令的输出相匹配,如下所示,但没有任何反应。有什么想法吗?

命令历史记录:

➜  ~/w/t/some-dir master ✓ git log
commit 4f6dc31e12fb6b39c8d44f293b7561f132c4d9ad
Author: Max Bigras <mbigras22@gmail.com>
Date:   Sun Oct 30 20:43:40 2016 -0700

    Add readme
➜  ~/w/t/some-dir master ✓ git lg
* 4f6dc31 - (HEAD -> master) Add readme (5 minutes ago) <Max Bigras>
➜  ~/w/t/some-dir master ✓ git --no-pager log --graph --pretty=oneline --abbrev-commit --decorate --all $*
* 4f6dc31 (HEAD -> master) Add readme
➜  ~/w/t/some-dir master ✓ git lol
➜  ~/w/t/some-dir master ✓

.gitconfig

[user]
    name = Max Bigras
    email = mbigras22@gmail.com
[core]
    editor = vim
    autocrlf = input
    excludesfile = /Users/max/.gitignore_global
[push]
    default = simple
[alias]
    co = checkout
    br = branch
    ci = commit
    s = status
    unstage = reset HEAD --
    quickcommit-m= "!git add -A; git commit -m"
    alias = config --get-regexp ^alias\\.
    lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
  lol = log --graph --pretty=oneline --abbrev-commit --decorate --all $*
[pager]
  lol = cat
  .
  .
  .

1 个答案:

答案 0 :(得分:1)

这里的问题是最后的$*。你应该简单地省略它。

解释

在shell脚本中,$*(或更好,"$@" - 请注意周围的双引号 1 )扩展为&#34;所有其他参数&#34;,其中这里是可取的。但是Git别名本身不是shell脚本,不应该这样对待。

相反,Git在末尾添加任何其他参数,而不管别名扩展。例如,用:

[alias]
    echo = !echo

我明白了:

$ git echo several additional arguments
several additional arguments

因此,要将剩余的参数传递给扩展命令(在本例中为echo,但在您的情况下为git log),您根本不执行任何操作。您可以使某些参数重复

[alias]
    echo = !echo $1

的产率:

$ git echo several additional arguments
several several additional arguments

但这不是目标,而$*只是扩展为文字$*

因为命令是! - 前缀并因此传递给shell,导致 shell 展开$*,所以它是很难证明:我们需要一个Git命令来打印它的参数。 rev-parse命令运行良好:

[alias]
    rp = rev-parse $*

之后:

$ git rp
$*
$ git rp master
$*
master
fatal: master: no such path in the working tree.
Use 'git <command> -- <path>...' to specify paths that do not exist locally.

或更好:

$ GIT_TRACE=1 git rp master
22:16:01.828980 git.c:563               trace: exec: 'git-rp' 'master'
22:16:01.831942 run-command.c:336       trace: run_command: 'git-rp' 'master'
22:16:01.850163 git.c:286               trace: alias expansion: rp => 'rev-parse' '$*'
22:16:01.850581 git.c:563               trace: exec: 'git-rev-parse' '$*' 'master'
22:16:01.850678 run-command.c:336       trace: run_command: 'git-rev-parse' '$*' 'master'
22:16:01.883257 git.c:350               trace: built-in: git 'rev-parse' '$*' 'master'
$*
master
fatal: master: no such path in the working tree.
Use 'git <command> -- <path>...' to specify paths that do not exist locally.

(在环境中设置GIT_TRACE=1是一个方便的调试技巧。)

1 双引号可以防止shell破坏包含空格的参数(实际上是$IFS值)。

在过去的糟糕时期,"$@"$#为零时失败,因为内部扩张最终产生了一个空洞的争论。因此我们必须拼写此${1+"$@"},即如果"$@"存在则使用$1,否则不使用任何内容。 POSIX解决了这个特殊问题。)