是否可以有一个 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" 模式,在该模式下您会自动重新配置并 运行.
这样效率更高(没有常量 运行 时间测试),但需要您记住当事情发生变化时要重新配置的内容。
我有一个全局 .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" 模式,在该模式下您会自动重新配置并 运行.
这样效率更高(没有常量 运行 时间测试),但需要您记住当事情发生变化时要重新配置的内容。