¿Es posible tener una configuration de git que depende de la versión instalada de git

Tengo un file global .gitconfig donde lo .gitconfig como un alias

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

Sin embargo, las versiones pnetworkingeterminadas de git instaladas en la mayoría de mis sistemas (Debian 7) son 1.7. En general, estoy feliz con ellos. Sin embargo, ese alias no funciona como se define con esa versión anterior de git.

Entonces, ¿hay alguna manera en .gitconfig para probar el git --version y definir el alias en consecuencia?

No, o más precisamente, no del modo en que estás pensando. Lo que puedes hacer es usar un poco de script de shell. La forma más clara, aunque less eficiente, puede ser escribir tres alias:

 [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 

El alias de tree ahora invoca la breve testing de script de shell: ¿es esta versión 1.7 o anterior (contando 1.7.x como "1.7 o anterior"), o es esta versión 1.8 o posterior? Si es 1.7 o anterior, ejecute git tree178 , de lo contrario ejecute git tree18plus . A continuación, puede hacer que esos alias hagan lo que quieran.

Por supuesto, si vas tan lejos, también podrías escribir un script de shell llamado git-tree y ponerlo en tu $PATH (lo pondría en mi directory $HOME/scripts , aquí es donde guardo los scripts son las mismas independientemente del sistema operativo y la CPU, mientras que $HOME/bin.amd64 , $HOME/bin.sparc , etc. contienen sistemas operativos y / o binarys dependientes de la architecture). El script puede leer:

 #! /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 # eg, 1.x < 2.* [ $1 -eq $maj -a $2 -le $min ] } if gitvers_le 1 7; then git ... else git ... fi 

Cuando ejecutas git tree (o cualquier cosa que comience con git que Git no pueda encontrar en un lugar estándar) y tienes un git-tree deletreado (o git-tree whatever ) en tu $PATH , Git ejecutará eso. El git "front-end" simplemente analiza algunas opciones universales, como -c y -C y --work-tree y así sucesivamente, y luego invoca el progtwig "back-end" git-whatever para hacer el trabajo, con estas opciones universales manejadas de alguna manera (generalmente estableciendo algunas variables de entorno).


Tenga en count que todas estas opciones cambian en time de ejecución , lo cual es bueno si tiene un administrador constantemente actualizando y / o degradando sus binarys debajo de usted. Otro método es realizar su configuration una vez , inicialmente reorganizando los elementos (por ejemplo, cambiar el nombre de los scripts en $HOME/scripts , o restablecer las configuraciones de .gitconfig alias) según corresponda para lo que esté instalado ahora, y luego volver a ejecutar el "control" y el command "mezclar": un script separado que usted mismo escribe y que hace lo que sea necesario, siempre y cuando su administrador actualice o baje de categoría sus binarys.

Es decir, la configuration "fuera de la caja" es "reconfigurar y ejecutar". La configuration ya reconfigurada es "ejecutada". Si la ejecución configurada falla, te dices a ti mismo: Aha, mi caja ha sido modificada, necesito volver a configurarla explícitamente. Si vuelve a instalar desde el principio, volverá al modo "listo para usar", donde se reconfigurará automáticamente y se ejecutará.

Esto es más eficiente (sin testings constantes de time de ejecución), pero requiere que recuerde qué hacer para reconfigurar cuando las cosas cambian.