是否可以有一个 git 配置取决于安装的 git 版本

Is it possible to have a git configuration that depends on the installed version fo git

我有一个全局 .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 并相应地定义别名?

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

[alias]
    tree = "!f() { set -- $(git --version | \
            sed -e 's/git version //' -e 's/\./ /g'); \
            if [  -eq 1 -a  -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 目录;这是我保存相同脚本的地方,无论 OS 和 CPU,而 $HOME/bin.amd64$HOME/bin.sparc 等包含 OS and/or 体系结构相关的二进制文件)。然后脚本可以读取:

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

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

当你 运行 git tree(或者 Git 无法在标准位置找到的任何以 git 开头的东西)并且你有一个拼写为 git-tree(或 git- 随便什么 )在你的 $PATH、Git 中会 运行。 "front end" git 简单地解析一些通用选项,如 -c-C--work-tree 等等,然后调用 "back end" git-whatever 程序来完成工作,这些通用选项以某种方式处理(通常通过设置一些环境变量)。


请注意,所有这些选项在 运行 时间 切换,如果您有管理员不断升级 and/or 降级您下面的二进制文件,这很好。另一种方法是设置 一次 ,最初随机排列项目(例如,重命名 $HOME/scripts 中的脚本,或重新设置 .gitconfig 别名设置)无论现在安装什么,然后重新 运行 宁 "check and shuffle" 命令——你自己编写的一个单独的脚本,它可以做任何需要的事情——如果你的管理员升级或降级你的二进制文件。

即"out of the box"配置为"reconfigure and run"。已经重新配置的配置是 "run"。如果配置运行失败,你对自己说:啊哈,我的盒子已经在我身上改变了,我需要明确地重新配置。如果你从头开始重新安装,你将自己设置回 "out of the box" 模式,在该模式下您会自动重新配置并 运行.

这样效率更高(没有常量 运行 时间测试),但需要您记住当事情发生变化时要重新配置的内容。