我有一个全局.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
并相应地定义别名?
答案 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;模式,您可以自动重新配置和运行。
这样更有效(没有持续的运行时测试),但要求您记住在事情发生变化时如何重新配置。