是否可以使用git配置,该配置取决于安装的git版本

时间:2016-11-05 00:13:24

标签: git config

我有一个全局.gitconfig文件,我将其定义为别名

alias.tree=log --pretty="format:%C(auto)%h %ad%d [%aN, %G?] - %s %N" --all --decorate --graph --color --date=short

但是,我的大多数系统(Debian 7)上安装的默认git版本是1.7。我对这些感到满意。但是,该别名不适用于旧版本的git。

那么,.gitconfig是否有办法测试git --version并相应地定义别名?

1 个答案:

答案 0 :(得分:3)

不,或者更确切地说,不是你想的那种方式。你可以做的是使用一些shell脚本。最清晰但效率最低的方法可能是编写三个别名:

[alias]
    tree = "!f() { set -- $(git --version | \
            sed -e 's/git version //' -e 's/\\./ /g'); \
            if [ $1 -eq 1 -a $2 -le 7 ]; then git tree17 \"$@\"; \
            else git tree18plus \"$@\"; fi; }; f"
    tree17 = whatever you want here
    tree18plus = whatever you want here

tree别名现在调用简短的shell脚本测试:是1.7或更早版本(计算1.7.x为" 1.7或更早版本"),或者是1.8或更高版本?如果是1.7或更早版本,请运行git tree178,否则运行git tree18plus。然后,您可以随意使用这些别名。

当然,如果你要走这么远,你也可以编写一个名为git-tree的shell脚本并将其放在$PATH中(我会把它放在我的$HOME/scripts中目录;这是我保持脚本无论操作系统和CPU是否相同的地方,而$HOME/bin.amd64$HOME/bin.sparc等包含操作系统和/或体系结构相关的二进制文件)。然后该脚本可以读取:

#! /bin/sh
#
# test git version, are we less than or equal to $1.$2?
gitvers_le() {
    local maj=$1 min=$2
    set -- $(git --version | sed -e 's/git version /' -e 's/\./ /g')
    if [ $1 -lt $maj ]; then return 0; fi # e.g., 1.x < 2.*
    [ $1 -eq $maj -a $2 -le $min ]
}

if gitvers_le 1 7; then
    git ...
else
    git ...
fi

当您运行git tree(或者实际上任何以git开头的Git无法在标准位置找到的内容)并且您有一个可执行拼写git-tree(或git-在你的$PATH ),Git会运行它。 &#34;前端&#34; git只是解析一些通用选项,例如-c-C以及--work-tree等等,然后调用&#34;后端&#34; git-whatever 程序来完成工作,以某种方式处理这些通用选项(通常通过设置一些环境变量)。

请注意,所有这些选项都会在运行时处切换,如果您的管理员不断升级和/或降级您的二进制文件,这是很好的选择。另一种方法是进行设置一次,最初根据所安装的内容对项目进行混洗(例如,重命名$HOME/scripts中的脚本,或重新设置.gitconfig别名设置)现在,然后重新运行&#34;检查并随机播放&#34;命令 - 您自己编写的单独脚本,可以执行任何操作 - 如果您的管理员升级或降级您的二进制文件。

即开箱即用&#34;开箱即用&#34;配置是&#34;重新配置和运行&#34;。已经重新配置的配置是&#34;运行&#34;。如果配置的运行失败,你会对自己说:啊哈,我的盒子已经改变了,我需要明确地重新配置。如果你从头开始重新安装,你就会把自己重新安装到&#34 ;开箱即用&#34;模式,您可以自动重新配置和运行。

这样更有效(没有持续的运行时测试),但要求您记住在事情发生变化时如何重新配置​​。