Можно ли установить параметры gitconfig условно?
Через Github я использую один и тот же набор "точечных файлов" на нескольких компьютерах и серверах. На ящиках Mac и Linux под моим непосредственным контролем у меня есть Sublime Text 2, который установлен и настроен как мой редактор . Однако на удаленном (то есть не под моим контролем) серверах я бы выбрал использовать vim.
Я бы предпочел не создавать и поддерживать второй .gitconfig
для этих удаленных серверов. Есть ли способ сделать что-то вроде этого:
[core]
if [[ $IS_REMOTE -eq 1 ]]; then
editor = "vim"
else
editor = "subl -n -w"
fi
где я как-то установил $IS_REMOTE на основе имени хоста?
Ответы
Ответ 1
Так как невозможно проверить переменную окружения и программно изменить файл .gitconfig, а так как создание сценариев создания двух файлов .gitconfig выглядит как больше работы, чем я действительно хочу выразить, я просто собираюсь создать два файла .gitconfig. На тех машинах, где я могу настроить Sublime Text 2 в качестве моего редактора и управлять инструментом слияния и инструментом diff, я буду использовать "основной" gitconfig в качестве цели моей символической ссылки. На тех машинах, где у меня нет ST2 в качестве опции, я буду использовать "вторичный" файл gitconfig.
Ответ 2
Нет, Git config не поддерживает проверки или условные операторы. Но ваша основная оболочка, вероятно, делает, поэтому вы можете использовать что-то вроде:
[core]
editor = "if [[ $IS_REMOTE -eq 1 ]]; then ED='vim'; else ED='subl -n -w'; fi; $ED"
Если вам нужно сделать что-то более сложное, вы можете просто выбросить код оболочки в script, конечно, как
[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, конечно:)
Ответ 3
Раздел [include]
, полученный с помощью git -config в v1.7.9, доставит вам большую часть пути.
Пока он не позволяет писать условные обозначения времени выполнения, он дает вам основу для рефакторинга ~/.gitconfig
в несколько частей: разделяемый раздел и разделы, зависящие от env. После этого вы можете связать что-то вроде ~/.gitconfig.local
с соответствующим конфигурационным файлом env и включить ~/.gitconfig.local
из ~/.gitconfig
.
Симлинг-часть может быть написана сценарием и сделана автоматически как часть инициализации dotfiles script.
В командной строке, включающий путь, можно добавить через:
git config --global include.path '~/.gitconfig.local'
Я использую кавычки выше специально, чтобы предотвратить расширение оболочки ~
до абсолютного пути.
Это добавляет следующий раздел в ваш ~/.gitconfig
:
[include]
path = ~/.gitconfig.local
Вот фрагмент из git -scm book, показывающий общий формат:
[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
Ответ 4
Я не думаю, что вы можете это сделать, но вместо сохранения вашего файла .gitconfig
, как насчет поддержки script, который генерирует ваш файл .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
Итак, если вы вызываете script без параметров или с параметром "local", он будет генерировать некоторую конфигурацию в вашем файле .gitconfig
, а если вы передадите ему параметр 'remote', он будет генерировать некоторые другие.
Ответ 5
не совсем ответ на ваш вопрос, но интересный для связанных с ним вопросов:
поскольку git 1.8.5 вам разрешено использовать синтаксис urlmatch
см
http://git-scm.com/docs/git-config
для деталей
записи конфигурации, касающиеся пультов, являются единственными, которые могут быть определены условно как
[http "https://localhost" ]
sslVerify = false
^ будет переключать проверку ssl только для локальных "пультов"