执行 Git 别名时如何显示完整命令?

15

当使用别名时,是否有选项可以显示完整命令?

例如:

$ git ci -m "initial commit"
Full command: git commit -m "initial commit"
...
$ git lg
Full command: git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
...

别名非常方便,但我喜欢学习/提醒自己我的别名实际上是做什么的(大多数别名都是从互联网上复制来的)

4个回答

3
另一种选择是Git维基百科部分中列出的命令别名,它为.git/configalias部分提供了指导。
    aliases = !git config --get-regexp 'alias.*' | colrm 1 6 | sed 's/[ ]/ = /'

这将以命令行的形式列出你的所有别名。

2

举个例子:

log-1 = "!sh -c 'echo \"完整命令:git log --graph --decorate --pretty=oneline --abbrev-commit\"; git log --graph --decorate --pretty=oneline --abbrev-commit' -"

你调用 shell 并执行给定的命令。

在你的 lg 示例中,你需要进行大量的转义,因为你有引号内嵌引号和需要转义的字符。建议你创建自己的漂亮格式并在别名中使用它。假设我们称你的格式为 mine。这是你需要做的:

git config --add pretty.mine "%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%C(bold blue)<%an>%Creset"

别名应该是

lg = "!sh -c 'echo \"完整命令:git log --graph --pretty=mine --abbrev-commit --date=relative\"; git log --graph --pretty=mine --abbrev-commit --date=relative' -"


2

使用环境变量GIT_TRACE启用git的跟踪功能,将显示git在扩展git别名后执行的确切命令。

这也可以减轻生成一个(另一个)shell和它所做的任何处理所产生的开销。

更复杂的git命令将提供详细的输出,解释git正在做什么。如果您只想知道别名扩展的结果,可以捕获stderr并搜索扩展(见下面的示例)。但是,请注意不要使用实际修改存储库的命令进行此操作(如果适用,请使用--dry-run)。

示例

将别名ls1定义为:

~$ cat .gitconfig|grep ls1
    ls1 = log --oneline -1

执行后会产生如下输出(在git的自己的仓库上,在默认主分支上提交2befe97后):

~/git (master=)$ GIT_TRACE=1 git ls1
11:14:16.075127 git.c:561               trace: exec: 'git-ls1'
11:14:16.075182 run-command.c:334       trace: run_command: 'git-ls1'
11:14:16.078823 git.c:278               trace: alias expansion: ls1 => 'log' '--oneline' '-1'
11:14:16.079032 git.c:344               trace: built-in: git 'log' '--oneline' '-1'
11:14:16.080189 run-command.c:334       trace: run_command: 'pager'
11:14:16.080536 run-command.c:193       trace: exec: 'pager'
2befe97 Eighth batch
~/git (master=)$ 

捕捉扩展
~/git (master=)$ GIT_TRACE=1 git ls1 2>&1 |grep "trace: alias expansion"
11:37:45.014231 git.c:278               trace: alias expansion: ls1 => 'log' '--oneline' '-1'
~/git (master=)$ 

0
如果您正在使用bash,则可以将“set -x”添加到别名中。因此,举个简单的例子,如果您有一个别名:
ol = !sh -c 'git log --oneline'

你需要将它改为:

ol = "!sh -c 'set -x; git log --oneline'"

需要在句点之后加上双引号。

为了让命令行的其他部分生效,您需要添加 "$@" ,并且加入一个 "-" 以使参数从 $1 开始。这会给你:

ol = "!sh -c 'set -x; git log --oneline $@' -"

更复杂的别名可能已经包含了这些内容。

我不知道有没有一种方法可以全局设置所有别名,但这将是很好的!

编辑: 使用一个 shell 函数会更容易一些。你可以这样做:

git config alias.ol '!f() { set -x; git log --oneline $@; }; f'

为了获得与上述相同的效果。


我不确定它是否适用于git别名(即在git配置中定义的别名)。 - CharlesB
会的。那是我测试它的地方。 - seumasmac
我的意思是,如果在git config中将git log别名设置为git log --oneline,它会起作用吗? - CharlesB
哦,没错。你可能可以强制它工作,但是shell会解释命令的某些部分(例如!),因此直接将其放入.git/config文件中更容易。这基本上就是“git config alias”所做的事情。 - seumasmac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接