2016-11-05 20 views
1

我有一個全球性的.gitconfig文件,我定義爲一個別名是否有可能有依賴於安裝的版本FO混帳

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

然而,混帳的默認版本在大多數的安裝git的配置我係統(Debian 7),是1.7。我通常對那些感到高興。但是,該別名不能像舊版本的git所定義的那樣工作。

那麼,.gitconfig有沒有辦法測試git --version並相應地定義別名?

回答

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 \"[email protected]\"; \ 
      else git tree18plus \"[email protected]\"; 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和/或體系結構相關的二進制文件)。然後,該腳本可以讀取:

#! /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會運行它。 「前端」git只是解析一些通用選項,如-c-C--work-tree等,然後調用「後端」git-whatever程序來完成這項工作,這些通用選項以某種方式處理(通常由設置一些環境變量)。


注意,所有這些選項在運行,如果你有一個管理員不斷的升級和/或降級二進制文件,下面這是很好的切換。另一種方法是先對執行一次,然後根據當前正在安裝的任何內容對其進行初始混洗(例如,重命名腳本$HOME/scripts或重新設置.gitconfig別名設置),然後重新運行「check and shuffle 「命令 - 您自己編寫的單獨腳本,可以執行所需的任何操作 - 如果和當您的管理員升級或降級您的二進制文件時。

也就是說,「開箱即用」配置是「重新配置和運行」。已經重新配置的配置是「運行」。如果配置的運行失敗,你對自己說:啊哈,我的箱子已經改變了我,我需要明確重新配置。如果您從頭開始重新安裝,您將自己重新設置爲「開箱即用」模式,您可以在其中自動重新配置並運行。

這樣更有效率(不會持續運行時測試),但要求您記住在事情發生變化時應該如何重新配置​​。

相關問題