用于创建别名的别名

时间:2014-05-29 05:02:29

标签: git alias

如何编写一个可让我创建更多别名的git别名?

例如:

git alias st status

应在git status下为st创建新的别名。

2 个答案:

答案 0 :(得分:10)

每个别名只是git配置文件的alias部分中的一个条目。例如,如果zog是别名,则为alias.zog

要更新git配置文件,您可以使用git config和其中一个选项来选择要更新的配置文件。最合适的此类选项是--global(影响适用于所有存储库的个人配置文件)和--local(仅影响当前存储库,即仅在一个存储库中工作的别名)。默认值为--local,但--global通常对别名更有意义。

让我们考虑一个简单的例子,让git zoggit 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-coreSee this post from 2012也详细说明了这一点。直接的一个例子是该文件夹中的git-stash shell脚本。

当我针对只有我的帐户需要的内容执行此操作时,我会将其放在~/binchmod +x <command>中。