tag tab publicar example create crear all git git-config

tab - publicar tag git



¿Se pueden configurar las opciones de gitconfig condicionalmente? (5)

Dado que no es posible probar una variable de entorno y alterar mediante programación el archivo .gitconfig, y desde la creación de secuencias de comandos, la creación de dos archivos .gitconfig parece más trabajo del que realmente quiero presentar, solo voy a crear dos .gitconfig archivos. En aquellas máquinas en las que puedo configurar Sublime Text 2 como mi editor y tener control sobre la herramienta de combinación y la herramienta de diferencias, usaré el gitconfig "principal" como objetivo de mi enlace simbólico. En aquellas máquinas donde no tengo ST2 como opción, usaré el archivo gitconfig "secundario".

A través de Github, uso el mismo conjunto de "archivos de puntos" en varias computadoras y servidores diferentes. En los cuadros de Mac y Linux bajo mi control directo, tengo instalado Sublime Text 2 y lo configuro como mi editor de git merge y commit. Sin embargo, en servidores remotos (es decir, no bajo mi control directo) seleccionaría usar vim.

Preferiría no crear y mantener un segundo .gitconfig para esos servidores remotos. ¿Hay una manera de hacer algo como esto:

[core] if [[ $IS_REMOTE -eq 1 ]]; then editor = "vim" else editor = "subl -n -w" fi

donde de alguna manera he establecido $ IS_REMOTE basado en el nombre de host?


La sección [include] aprendida por git-config en v1.7.9 te lleva a la mayor parte del camino.

Si bien no le permite escribir condicionales de tiempo de ejecución, le brinda un marco para refactorizar su ~/.gitconfig en varias partes: la sección compartida y las secciones específicas de env . Después de eso, puede crear un enlace simbólico de algo como ~/.gitconfig.local al archivo de configuración relevante específico de env, e incluir ~/.gitconfig.local desde ~/.gitconfig .

La parte de symlinking se puede crear una secuencia de comandos y se realiza automáticamente como parte de la secuencia de comandos de inicio de los archivos de puntos.

Desde la línea de comandos, esa ruta de inclusión se puede agregar a través de:

git config --global include.path ''~/.gitconfig.local''

Uso las citas anteriores específicamente para evitar que el shell se expanda ~ a una ruta absoluta.

Eso agrega la siguiente sección a tu ~/.gitconfig :

[include] path = ~/.gitconfig.local

Aquí hay un fragmento del libro git-scm que muestra el formato general:

[include] path = /path/to/foo.inc ; include by absolute path path = foo ; expand "foo" relative to the current file path = ~/foo ; expand "foo" in your $HOME directory


No creo que puedas hacer esto, pero en lugar de mantener tu archivo .gitconfig , ¿qué te parece mantener un script que genere tu archivo .gitconfig ? De esa manera, puede hacer lo que quiera, basándose no solo en variables sino también en la salida de comandos y lo que sea ...

me gusta:

#!/bin/sh if [ "$#" -eq 0 ] then IS_REMOTE= else case "$1" in remote) IS_REMOTE=1 ;; local) IS_REMOTE= ;; *) echo "value $1 not supported" >&2 ;; esac fi # config for both remote and local git config --global color.ui true git config --global alias.top ''!pwd -L'' # config for remote if [ "$IS_REMOTE" ] then git config --global core.editor vim ... else git config --global core.editor ''subl -n -w'' ... fi

Entonces, si llama al script sin parámetros, o con el parámetro ''local'', generará alguna configuración en su archivo .gitconfig , mientras que si le pasa el parámetro ''remoto'', generará algunos otros.


No es exactamente una respuesta a tu pregunta, pero es interesante para los casos de uso relacionados: desde git 1.8.5 puedes usar la sintaxis de urlmatch

vea http://git-scm.com/docs/git-config para más detalles

las entradas de configuración relacionadas con los controles remotos son las únicas que se pueden definir condicionalmente como [http "https://localhost" ] sslVerify = false

^ cambiará de verificación ssl solo para "remotos" de localhost


No, Git config no admite comprobaciones ni declaraciones condicionales. Pero tu shell subyacente probablemente lo haga, así que puedes usar algo como:

[core] editor = "if [[ $IS_REMOTE -eq 1 ]]; then ED=''vim''; else ED=''subl -n -w''; fi; $ED"


Si necesita hacer algo más complicado que eso, podría simplemente lanzar el código de shell en un script, por supuesto, como

[core] editor = "my_edi_script.sh"

con my_edit_script.sh contiene algo como:

#!/bin/bash if [[ $IS_REMOTE -eq 1 ]]; then ED="vim" else ED="subl -n -w" fi $ED some argument or other

Edición : my_edit_script.sh tendría que estar en el $ PATH, por supuesto :)