如何在.gitconfig中创建临时变量?

时间:2016-12-23 00:16:16

标签: git

有时候我在别名的参数列表中有一个long和string;例如,差异突出显示的完整路径,或者是一个非常冗长且令人困惑的漂亮格式字符串。

我想将这些字符串放在一个临时变量中,以便我可以执行以下操作,我发现它比内联更具可读性:

[alias]
    FMT_OF_DEATH="somethinghideouslylongandunreadable"
    hist = log --pretty=format:$FMT_OF_DEATH --graph --date=short

我可以这样做,如果是的话,怎么做?

1 个答案:

答案 0 :(得分:2)

[编辑]请参阅下面的详细信息,但事实证明,对于--pretty=format,这已经内置了(自Git版本1.7.10起)。

鉴于--pretty=format:namegit log会在[format]部分中查找名称。因此,您只需要在git log --pretty=format:death --graph --date=short中使用您的死亡格式运行format.death。这些名称也会以递归方式进行扩展,因此您可以在配置中使用format.death = format.death1 format.death2format.death1format.death2扩展为%...指令(以及您喜欢的任何文字字符串)

对于不是格式字符串的东西,你仍然必须以艰难的方式去做。

艰难的方式

要做到这一点,你必须调用shell并让shell调用git config --get(或等效的)来扩展内部部分。因此,您最终需要注意shell是否可以扩展任何外部部分。幸运的是,对于Git来说,很多项目都没有被淘汰。 (对于其他类似工作的程序,情况并非如此。)因此,继续使用格式化的想法 - 您需要为其他命令提供不同的东西:

[format]
    death = somethinghideouslylongandunreadable   
[alias]
    hist = !git log "--pretty=format:"\"$(git config --get format.death)\" \
      --graph --date=short

请注意,这可以更灵活,因为您可以预编码您喜欢的许多致命格式,然后使用命令行参数选择一种。但是,此时别名本身变得非常复杂,您可能只想将其编写为shell脚本,您可以使用git-sh-setup及其各种功能:

[format]
    death1 = ...
    death2 = ...

加:

#! /bin/sh
# git-hist: run git log with --pretty=format:<fmt> where <fmt>
# is extracted via "git config --get format.whatever", where
# the "whatever" part is an argument

USAGE="which-format [args passed through to git log]"

. git-sh-setup

case $# in
0) usage;;
*) fmt=$(git config --get format."$1") ||
     die "hist: no \"format.$1\" found (check git configuration)"
   shift;;
esac

exec git log --pretty=format:"$fmt" --graph --date=short "$@"

$PATH的某个位置使用此脚本,您只需运行git hist foo即可获得format.foo格式的输出。您可以使用--date覆盖zorg并从分支git hist foo --date=long zorg进行记录,依此类推。

但是既然它都是内置的,你也可以这么简单!