列出Git别名

619

我该如何打印出我的git别名列表,就像bash中的alias命令一样?


8
我认为下面的顶级答案可以解决问题,也许你应该接受它? - domoarigato
@domoarigato 谢谢。很抱歉我没有接受答案,现在我已经这样做了。 - ma11hew28
这可能是一个有用的问题候选人,它已经没有被接受的答案最长时间了 :) :P - domoarigato
@domoarigato 哈哈,好的,谢谢。 :-) - ma11hew28
24个回答

662
您可以使用正则表达式^alias,即以 alias 开头的所有配置,与--get-regexp一起使用。
git config --get-regexp ^alias

56
严谨一些说,应该是 '^alias\.' - Josh Lee
49
git config -e 只编辑 .git/config 文件。但是我的大多数别名都在全局的 ~/.gitconfig 中定义。 - Boldewyn
30
要实用的话,应该是 git config --global alias.aliases config --get-regexp '^alias\.'" 然后 git aliases - Derek Greer
9
@DerekGreer 你错过了一个 " 符号。 - Jake Berger
11
git config --global alias.aliases "config --get-regexp '^alias\.'" and then git aliases - Ondra Žižka
显示剩余8条评论

211
这篇回答是在johnnyanswer基础上进行的。如果你没有使用git-extras中的git-alias,则适用本文内容。
在Linux系统上,运行以下命令:
git config --global alias.alias "! git config --get-regexp ^alias\. | sed -e s/^alias\.// -e s/\ /\ =\ /"

这将创建一个名为alias的永久git别名,它将存储在您的~/.gitconfig文件中。使用它将列出所有git别名,几乎与~/.gitconfig文件中的格式相同。要使用它,请键入:
$ git alias
loga = log --graph --decorate --name-status --all
alias = ! git config --get-regexp ^alias\. | sed -e s/^alias\.// -e s/\ /\ =\ /

以下是需要考虑的事项:
  • 为了防止别名 alias 被列在上面,请在双引号关闭之前添加 | grep -v ^'alias '。我不建议这样做,因为用户可能会忘记 alias 命令只是一个别名,而不是 git 的功能。

  • 要对列出的别名进行排序,请在双引号关闭之前添加 | sort。或者,您可以保持 ~/.gitconfig 中的别名已排序。

  • 要将别名添加为系统范围的别名,请将 --global(用于当前用户)替换为 --system(适用于所有用户)。这通常放在 /etc/gitconfig 文件中。


4
我喜欢这个选择,因为它消除了每行开头的“alias.”。 - Brian J
3
不确定原因,但这个答案对我不起作用。我一直得到“fatal: bad config”的错误。不过,Git-extra的解决方案对我有效:https://github.com/tj/git-extras/blob/master/bin/git-alias - Ashitaka
1
@Ashitaka,尝试使用限制版本,例如git config --global alias.alias"!git config --get-regexp ^alias\."。或者,通过git version确保您拥有当前版本的git。 - Asclepius
这真是一项非常出色的工作,以极其易用的方式将所有内容整合在一起! - UpAndAdam
2
只需要一个表达式:sed -e 's/\\(^alias\\)\\./\\1 = /'。我喜欢加入一些颜色:sed -e 's/^alias\\.\\([^ ]*\\)/\\x1B[33m\\1\\x1B[0m =/' - caduceus
显示剩余4条评论

166
我创建了一个名为"alias"的git别名,目的就是为了方便...如果你经常使用别名,这个别名会在某些时候很有用... $ git config --global alias.alias "config --get-regexp ^alias\." 注意:正则表达式确保该行以"alias."开头。

我已经添加了一个答案,该答案在这个答案的基础上稍微做了些补充。 - Asclepius
2
我建议使用--system而不是--global,因为像这样的东西在系统级别上更有用,而不是用户级别上。 - ADTC
2
如果您想将其直接添加到gitconfig中,它必须如下所示:alias = config --get-regexp ^alias\\. - marczych
git config --global alias.alias "!git config --get-regexp ^alias\. | grep -Po '(?<=alias\.)\S*' | sort" 这个命令怎么样? - Keith Robertson

110
另一个选择(仅是我觉得易于记忆的方式): git config --list | grep alias (注:该命令用于查看Git配置中已定义的所有别名)

14
说到易于记忆,你不妨创建alias别名,然后忘记你甚至创建了它。 - Asclepius
3
дҪ еҸҜд»ҘдҪҝз”Ё-lдҪңдёә--listзҡ„еҝ«жҚ·ж–№ејҸпјҢдҪҶжҲ‘и®ӨдёәеҲӣе»әдёҖдёӘеҲ—еҮәеҲ«еҗҚзҡ„еҲ«еҗҚжҳҜдёӘеҘҪдё»ж„ҸгҖӮ - ADTC
1
好的解决方案,但更好的方法是使用带有正则表达式的grep,以便在某些配置中包含关键字“alias”时产生以alias开头的行:git config --list | grep -E '^alias' - MasterMind

30
以下内容适用于Linux、MacOSX和Windows(使用msysgit)。
使用git la显示.gitconfig中的别名。
我听到了“bash脚本”? ;)
关于上面评论中的“不需要”的部分,我基本上为我的别名创建了一个类似于手册的概述。为什么要这么麻烦呢?这完全是过度设计吗?
请继续阅读...
我已经在我的.gitconfig文件中设置了这些命令,像这样分开:TAB=TAB
[alias]
        alias1            =            foo -x -y --z-option
        alias2            =            bar -y --z-option --set-something

我将简单地定义另一个别名以便于grep已定义别名中的TAB=部分。(所有其他选项在其定义中'='之前和之后都没有制表符,只有空格。)
未附加到别名的注释也会添加TAB=====,因此它们在使用grep查找后会显示。
为了更好地查看,我正在将grep输出导入到less中,就像这样:

基本版本:(黑/白)

  #.gitconfig
  [alias]
        # use 'git h <command>' for help, use 'git la' to list aliases  =====
        h     =     help #... <git-command-in-question>
        la    =     "!grep '\t=' ~/.gitconfig | less" 

"

'\t=' 部分匹配 TAB=

为了更好地查看我的别名,因为我使用bash控制台,我用终端颜色着色输出:

  • 所有 '=' 以红色打印
  • 所有 '#' 以绿色打印

高级版本:(彩色)

"
       la      =       "!grep '\t=' ~/.gitconfig | sed -e 's/=/^[[0;31m=^[[0m/g' | sed -e 's/#.*/^[[0;32m&^[[0m/g' | less -R"

基本上和上面一样,只是添加了sed的用法来将颜色代码输出。
需要使用-R标志才能在less中显示颜色。
(最近我发现,在移动设备上,带有滚动条的长命令无法正确显示:文本被截断,滚动条也被简单地省略了。在外出时查看此处的代码片段时,请记住这一点。)

为什么让这种魔法起作用?

我有大约半英里长的别名,根据我的需求定制。
此外,其中一些别名会随着时间而改变,因此最好的主意是解析.gitconfig文件,以便随时掌握最新的列表。

以下是我.gitconfig文件中别名的****简短****摘录:

    #  choose       =====
    a       =       add #...
    aa      =       add .
    ai      =       add -i
    #  unchoose     =====
    rm      =       rm -r #... unversion and delete
    rmc     =       rm -r --cached #... unversion, but leave in working copy
    #  do   =====
    c       =       commit -m #...
    fc      =       commit -am "fastcommit"
    ca      =       commit -am #...
    mc      =       commit # think 'message-commit'
    mca     =       commit -a
    cam     =       commit --amend -C HEAD # update last commit
    #  undo =====
    r       =       reset --hard HEAD
    rv      =       revert HEAD

在我的Linux或Mac工作站上,.bashrc文件中还存在进一步的别名,类似于:
#.bashrc
alias g="git"
alias gh="git h"
alias gla="git la"
function gc { git c "$*" } # this is handy, just type 'gc this is my commitmessage' at prompt

这样就不需要输入 git help submodule,也不需要 git h submodule,只需要 gh submodule 就可以获取帮助。虽然只是一些字符,但你有多少次要输入它们呢?

当然,我使用了以下所有命令,只是用了快捷方式…

  • add
  • commit
  • commit --amend
  • reset --hard HEAD
  • push
  • fetch
  • rebase
  • checkout
  • branch
  • show-branch(有很多变体)
  • shortlog
  • reflog
  • diff(有很多变体)
  • log(有很多变体)
  • status
  • show
  • notes
  • ...

这只是我头脑中的一部分。

我经常不使用图形界面使用 git,因为很多 git 命令在任何图形界面中都没有得到很好的实现。但每次我使用它们时,大多数情况下都是以相同的方式。

在上一段中提到的“未实现”部分:
我还没有找到任何与GUI相比较的东西:
sba = show-branch --color=always -a --more=10 --no-name - 显示所有本地和远程分支以及它们内部所包含的提交
ccm = "!git reset --soft HEAD~ && git commit" - 更改最后一次提交的消息

从一个更简单的角度来看:
你有多经常输入 git add . 或者 git commit -am "..."?甚至不算其余部分...
让事情像在Windows中使用 git aa 或者 git ca "..."
或者使用bash别名 gaa/g aa 或者 gca "..."/g ca "..." 在Linux和Mac上...

对于我的需求来说,这似乎是一个明智的做法,像这样定制git命令...为了更容易使用,我只使用了较少使用的命令,这样我就不必每次都查看手册。命令是预定义的,并且查找它们非常容易。
我的意思是,我们毕竟是程序员?让事情按照我们的需求工作是我们的工作。
这里还有一张额外的屏幕截图,这在Windows中可以工作:

script working with cmd.exe

奖励:如果你使用的是Linux或Mac,彩色的man手册可以帮助你很多:

彩色的man手册


1
我无法在Windows上使其工作。例如,输出为空:la = "!grep '\t=' ~/.gitconfig | less" - chwi
1
@Wilhelmsen:你是不是从上面的列表中复制粘贴了一些东西?你真的在每个“=”之前都有一个“TAB”吗?如果是空格,它将无法工作。我自己的Windows .gitconfig 中也有空格,但是一旦我用单个制表符替换它们,cmd.exe就会像预期的那样运行。 - sjas
4
过度工程化 - Ed_
取决于您使用某个东西的频率。 - sjas

19

正如其他答案所提到的,git config -l列出你的配置文件中的所有配置详情。以下是我配置文件输出的部分示例:

...
alias.force=push -f
alias.wd=diff --color-words
alias.shove=push -f
alias.gitignore=!git ls-files -i --exclude-from=.gitignore | xargs git rm --cached
alias.branches=!git remote show origin | grep \w*\s*(new^|tracked) -E
core.repositoryformatversion=0
core.filemode=false
core.bare=false
...

因此,我们可以使用git config -l | grep alias来搜索别名行:

alias.force=push -f
alias.wd=diff --color-words
alias.shove=push -f
alias.gitignore=!git ls-files -i --exclude-from=.gitignore | xargs git rm --cached
alias.branches=!git remote show origin | grep \w*\s*(new^|tracked) -E

我们可以通过删除每行的别名 (alias.) 部分来使其更加美观,留下以下命令:
git config -l | grep alias | cut -c 7-

输出如下:

force=push -f
wd=diff --color-words
shove=push -f
gitignore=!git ls-files -i --exclude-from=.gitignore | xargs git rm --cached
branches=!git remote show origin | grep \w*\s*(new^|tracked) -E

最后,别忘了将此添加为别名:
git config --global alias.la "!git config -l | grep alias | cut -c 7-"

享受吧!


17

我在我的全局 ~/.gitconfig 中使用 这个别名

# ~/.gitconfig

[alias]
    aliases = !git config --get-regexp ^alias\\. | sed -e s/^alias.// -e s/\\ /\\ $(printf \"\\043\")--\\>\\ / | column -t -s $(printf \"\\043\") | sort -k 1

为了产生以下输出:
$ git aliases
aliases   --> !git config --get-regexp ^alias\. | sed -e s/^alias.// -e s/\ /\ $(printf "\043")--\>\ / | column -t -s $(printf "\043") | sort -k 1
ci        --> commit -v
cim       --> commit -m
co        --> checkout
logg      --> log --graph --decorate --oneline
pl        --> pull
st        --> status
...       --> ...

(注意:这个命令在Windows上的git bash中可行。对于其他终端,您可能需要适应转义。)


解释

  1. !git config --get-regexp ^alias\\. 打印所有以 alias. 开头的 git config 行。
  2. sed -e s/^alias.// 从行中删除 alias.
  3. sed -e s/\\ /\\ $(printf \"\\043\")--\\>\\ / 将第一个空格替换为 \\ $(printf \"\\043\")--\\>(它会被解析为 #-->)。
  4. column -t -s $(printf \"\\043\") 将所有行格式化为均匀间隔的列表。字符 $(printf \"\\043\"),它会被解析为 #,用作分隔符。
  5. sort -k 1 基于第一列的值对所有行进行排序。

$(printf \"\043\")

这只是打印字符 #(十六进制 043),用于列分隔符。我使用这个小技巧,使得 aliases alias 本身不包含字面上的 # 字符。否则,它将在打印时替换那些 # 字符。 注意:如果需要带有字面上的 # 符号的别名,请将其更改为其他字符。


17

我在2018年6月提到了Git 2.18中的 "overview list - most used git commands",其中提到 "使用--list-cmds=alias (commit 3301d36)",carejhis answer中报告了这一点。

 git --list-cmds=alias

除了使用git config --get-regexp alias命令之外,您还可以将其输出与git help命令结合使用,它的输出会随着Git 2.14.x/2.15的变化而改变:

"git help co"现在显示为"co is aliased to ...",而不是"git co is"。

请参见commit b3a8076(由Kaartic Sivaraam (sivaraam)于2017年9月12日提交)。
(由Junio C Hamano -- gitster --commit 5079cc8于2017年9月25日合并)

help:更改消息以使其更加精确

当用户尝试在别名命令上使用'--help'选项时,将打印有关别名的信息,如下所示:

$ git co --help
`git co' is aliased to `checkout'

这似乎不正确,因为用户只使用了'co'而没有用'git co'作为别名。
在用户使用类似'tgit'的别名时,这甚至可能是错误的。
$ tgit co --help
`git co' is aliased to `checkout'

17

使用 git var 命令,并过滤出以 alias 开头的内容:

git var -l | grep -e "^alias"

17

两种方法都有效

1 - 使用正则表达式获取

$ git config --get-regexp alias

2 - 使用列表

$ git config --list | grep alias

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