在我的.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
.
.
.
答案 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解决了这个特殊问题。)