如何编写一个可让我创建更多别名的git别名?
例如:
git alias st status
应在git status
下为st
创建新的别名。
答案 0 :(得分:10)
每个别名只是git配置文件的alias
部分中的一个条目。例如,如果zog
是别名,则为alias.zog
要更新git配置文件,您可以使用git config
和其中一个选项来选择要更新的配置文件。最合适的此类选项是--global
(影响适用于所有存储库的个人配置文件)和--local
(仅影响当前存储库,即仅在一个存储库中工作的别名)。默认值为--local
,但--global
通常对别名更有意义。
让我们考虑一个简单的例子,让git zog
与git log
的意思相同:
$ git config --global alias.zog log
$ git zog --oneline
a17003a change f1
9af3861 initial
现在让我们将其从含义log
更改为含义frog
:
$ git config --global alias.zog frog
$ git zog
Expansion of alias 'zog' failed; 'frog' is not a git command
最后,我们会删除它,因为这只是为了说明而且是时候清理了:
$ git config --global --unset alias.zog
$ git zog
git: 'zog' is not a git command. See 'git --help'.
Did you mean this?
log
你说你想要一个创建更多别名的别名。这意味着我们希望别名alias
运行git config
。这几乎可以工作:
git config --global alias.alias 'config --global alias.'
除了一个非常大的问题:使用此别名,运行git alias st status
会产生相当于命令:
git config --global alias. st status
当我们想要一个alias.st
作为第一个参数时。此外,如果存在多个参数,我们会遇到剩余参数的问题:git config
会使它们分裂得不恰当。
因此,我们需要求助于调用shell。有许多方法可以对剩余部分进行编码。它们很难输入shell命令;编辑配置文件并手动放入(git config --global --edit
会执行此操作,或者您可以直接调用编辑器)更容易。
这是git作者的一个例子(我添加了一些反斜杠 - 换行符位以使其更适合StackOverflow;请注意,可以在各种配置文件中以这种方式编写别名):< / p>
[alias]
alias = "!sh -c '[ $# = 2 ] && \
git config --global alias.\"$1\" \"$2\" && exit 0 || \
echo \"usage: git alias <new alias> <original command>\" >&2 && exit 1' -"
为了使这个工作,我必须在最后添加另一个-
(上面没有显示);我不确定为什么,可能是一些FreeBSD sh
方差。
这是我的同一个版本,使用shell函数来处理参数。如果您提供两个以上的参数,则会合并所有附加内容:
[alias]
alias = "!f() { a=\"$1\"; shift; \
git config --global alias.\"$a\" \"$*\"; }; f"
现在:
$ git alias st status --short
$ GIT_TRACE=1 git st
trace: exec: 'git-st'
trace: run_command: 'git-st'
trace: alias expansion: st => 'status' '--short'
trace: built-in: git 'status' '--short'
(或者只需查看配置文件,使用编辑器或git config --get
)。
这两个版本仍然有点缺陷,因为他们可以尝试重新别名现有的别名。最好看看配置文件中是否已有alias."$1"
,如果是,则抱怨(或需要--overwrite
之类的参数或realias
之类的别名或其他别名)。您可以随意尝试使用git对多个条目执行的操作,例如alias.foo
,并查看git config
的文档,了解git config
如何处理多个条目( 允许,在各种情况下)。
作为一般规则,一旦你的git别名开始变得像这样毛茸茸,最好只为它编写一个shell脚本(或shell函数)。
答案 1 :(得分:0)
您可以编写一个名为git-createalias
的脚本,它会像您期望的那样工作,例如git createalias
。使其成为bash命令或使用您喜欢的脚本语言。使用它可以直接从命令行为您创建新的别名。
例如,创建一个bash(或其他编程语言)并将其命名为git-newalias
并让它接受任何参数。让它将所需的格式写入.gitconfig
,然后下一个git命令将读取该文件并获得所需的解决方案。正如@torek更全面地解释,你可以这样做,但我仍然建议你只需编写一个git-command作为脚本(shell)程序,然后根据需要使用它。
它们不同,但考虑到您可以通过名称实现脚本(确保使用bash或您喜欢的语言)的功能。 Git本身是一个独立文件的集合,看起来像你正在执行命令,例如git commit,实际上是git-commit。有关常见的Linux发行版,请参阅ls /usr/lib/git-core
。 See this post from 2012也详细说明了这一点。直接的一个例子是该文件夹中的git-stash shell脚本。
当我针对只有我的帐户需要的内容执行此操作时,我会将其放在~/bin
和chmod +x <command>
中。