Можно ли установить параметры gitconfig условно?

Через Github я использую один и тот же набор «точечных файлов» на нескольких разных компьютерах и серверах. На компьютерах Mac и Linux, находящихся под моим непосредственным контролем, я установил Sublime Text 2 и настроил его в качестве редактора слияния и фиксации git по выбору. Однако на удаленных (т.е. не находящихся под моим прямым контролем) серверах я бы выбрал vim.

Я бы предпочел не создавать и поддерживать второй .gitconfig для этих удаленных серверов. Есть ли способ сделать что-то вроде этого:

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

где я как-то установил $ IS_REMOTE на основе имени хоста?


person Mark Nichols    schedule 07.02.2013    source источник
comment
Почему бы просто не использовать файл сценария как значение редактора, в котором вы это проверяете? (Потому что нет, git config не является условным)   -  person Nevik Rehnel    schedule 07.02.2013
comment
Условное включение gitconfig становится возможным с Git 2.13. См. мой ответ   -  person VonC    schedule 26.04.2017


Ответы (6)


Нет, Git config не поддерживает проверки или условные операторы. Но ваша основная оболочка, вероятно, работает, поэтому вы можете использовать что-то вроде:

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


Если вам нужно сделать что-то более сложное, вы можете просто вставить код оболочки в сценарий, конечно, например

[core]
    editor = "my_edi_script.sh"

где my_edit_script.sh содержит что-то вроде:

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

$ED some argument or other

Изменить: my_edit_script.sh, конечно же, должен быть в $ PATH :)

person Nevik Rehnel    schedule 07.02.2013
comment
В дополнение к настройкам редактора, настройки инструментов слияния и сравнения также изменятся для удаленных компьютеров. Я думаю, что в конечном итоге решение состоит в том, чтобы иметь два файла .gitconfig. - person Mark Nichols; 08.02.2013
comment
Пробовал оба ваших метода, но они не работали для параметра credential.helper. У меня есть такие ошибки: git: 'credential-my_credential_script.sh' не является командой git. - person metakermit; 31.07.2014
comment
[alias]NEWLINEHEREb = "!if [ -z $1 ]; then git branch -av; else git branch $1 $2 $3 $4; fi" есть ли способ заставить эту работу работать без появления синтаксической ошибки? - person Unknow0059; 11.01.2021

Раздел [include], изученный git-config в v1.7.9 дает вам большую часть пути.

Хотя он не позволяет писать условия выполнения, он дает основу для рефакторинга вашего ~/.gitconfig на несколько частей: раздел shared и env- конкретные разделы. После этого вы можете создать символическую ссылку вроде ~/.gitconfig.local на соответствующий файл конфигурации, специфичный для env, и включить ~/.gitconfig.local из ~/.gitconfig.

Часть символической ссылки может быть написана и выполнена автоматически как часть сценария инициализации ваших точечных файлов.

В командной строке этот включаемый путь можно добавить с помощью:

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

Я использую приведенные выше кавычки специально, чтобы оболочка не расширяла ~ до абсолютного пути.

Это добавляет в ваш ~/.gitconfig следующий раздел:

[include]
    path = ~/.gitconfig.local

Вот фрагмент из книги git-scm, показывающий общий формат:

[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
person Community    schedule 11.12.2014

Вы можете условно включить другой файл конфигурации Git на основе вашего каталога или ветки Git в Git 2.13 и более поздних версиях.

Сохраните конфигурацию по умолчанию в файле ~/.gitconfig как обычно. В конце условно включите еще один файл конфигурации:

[user]
    email = [email protected]
    name = John McGehee

# All work Git repositories are in a subdirectory of ~/work.
# All other Git repositories are outside ~/work.
[includeIf "gitdir:~/work/"]
    path = .gitconfig.work

Затем в ~/.gitconfig.work добавьте или переопределите значения конфигурации, которые вы хотите использовать при использовании репозитория, расположенного в ~/work или любом его подкаталоге:

[user]
    email = [email protected]

Вы можете заметить разницу, перейдя в каталог Git в ~/work и запустив:

git config user.email

Попробуйте выполнить ту же команду в каталоге Git, который не находится в ~/work.

person John McGehee    schedule 04.12.2019

Я не думаю, что вы сможете это сделать, но как насчет поддержки сценария, который генерирует ваш .gitconfig файл, вместо того, чтобы поддерживать ваш .gitconfig файл? Таким образом, вы можете делать все, что захотите, основываясь не только на переменных, но и на выводе команд и тому подобном ...

как:

#!/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

Итак, если вы вызываете сценарий без параметров или с параметром «local», он сгенерирует некоторую конфигурацию для вашего .gitconfig файла, а если вы передадите ему параметр «удаленный», он сгенерирует некоторые другие.

person Carlos Campderrós    schedule 07.02.2013
comment
Хотя меня привлекает идея использования сценария для создания файла .gitconfig, поскольку мне приходилось обновлять два варианта .gitconfig, я думаю, что это больше работы, которую я готов выполнить. - person Mark Nichols; 08.02.2013
comment
Технически это сработает, но это неправильный подход. Ответы выше намного проще и понятнее. - person sferencik; 05.07.2018

не совсем ответ на ваш вопрос, но интересен для связанных случаев использования: поскольку git 1.8.5 вам разрешено использовать синтаксис urlmatch

подробности см. в http://git-scm.com/docs/git-config.

записи конфигурации, касающиеся пультов, являются единственными, которые могут быть определены условно как [http "https://localhost" ] sslVerify = false

^ переключит проверку ssl только для "удаленных" локального хоста

person childno͡.de    schedule 22.07.2015

Поскольку невозможно протестировать переменную среды и программно изменить .gitconfig, и поскольку создание сценариев для создания двух файлов .gitconfig кажется большим объемом работы, чем я действительно хочу выполнить, я просто собираюсь создать два .gitconfig файлы. На тех машинах, где я могу установить Sublime Text 2 в качестве редактора и контролировать инструменты слияния и сравнения, я буду использовать «основной» gitconfig в качестве цели моей символической ссылки. На тех машинах, где у меня нет ST2 в качестве опции, я буду использовать «вторичный» файл gitconfig.

person Mark Nichols    schedule 08.02.2013
comment
Вы можете разделить общую конфигурацию в третьем файле и включить ее в другие: stackoverflow.com/questions/4030540/ - person Chiel ten Brinke; 18.04.2016
comment
Это не следует отмечать как лучший ответ. Он просто показывает ваши предпочтения, на которые влияет то, что вы отказываетесь от реальной цели. Если кто-то все еще хочет это сделать, лучший ответ - один из вышеперечисленных. - person sferencik; 05.07.2018