Git, по-видимому, поддерживает значения конфигурации на трех уровнях:
- Глобальные настройки для каждой системы (хранятся в
/etc/git-core
) - Глобальные настройки для каждого пользователя (хранятся в
~/.gitconfig
) - Локальные настройки для каждого репозитория (хранятся в
$REPO/.git/config
)
Эти параметры охватывают большую часть базы, но я ищу способ справиться с четвертым уровнем. У меня есть (очень) большая коллекция репозиториев, для которых мне нужно использовать значение, отличное user.email
от моего обычного. Эти репозитории часто создаются и управляются с помощью автоматизированных скриптов, а настройка локальных настроек для каждого репозитория обременительна.
Все рассматриваемые репозитории находятся под определенным префиксом пути в моей локальной системе. Есть ли способ задать значение конфигурации где-то, которое будет унаследовано всеми репозиториями под этим путем? (Что-то вроде того, как .htaccess
настройки наследуются по всей файловой системе.) Возможно, есть способ задать условные значения в глобальном файле конфигурации? Какие еще договоренности можно сделать в среде UNIX, чтобы справиться с набором репозиториев, подобных моему?
решение1
Я не нашел способа настроить git на этом четвертом уровне. Единственный способ, похоже, — переопределение значений конфигурации для каждой команды с помощью git -c key=value
.
Мое текущее хакерское решение — определить функцию оболочки, которая служит оболочкой для git. При вызове она передает аргументы в системную команду git, но не раньше, чем проверит текущий рабочий каталог и добавит дополнительный аргумент к команде, если это применимо.
function git () {
case "$PWD" in
/path/to/repos/*)
command git -c [email protected] "$@"
;;
*)
command git "$@"
;;
esac
}
решение2
Посмотрите это решение на основе конфигурации git:
https://dzone.com/articles/how-to-use-gitconfigs-includeif
Добавьте в файл «~/.gitconfig»:
[includeIf "gitdir:~/work/project1/.git"]
path = .gitconfig-project1
Создайте файл «~/.gitconfig-project1» с содержимым:
[core]
sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"
[user]
name = user1
email = [email protected]
решение3
Вы можете настроить адрес электронной почты для git с помощью переменной окружения GIT_AUTHOR_EMAIL
. Если вы объедините это сВыполнять bash-скрипты при входе в каталогилиКонфигурация оболочки для конкретного каталога с zshВы можете легко изменить настройки для каждого каталога или родительского каталога, например, если вы войдете в каталог, ~/work
вы можете автоматически настроить переменные среды, чтобы изменить свой адрес электронной почты.
решение4
На основе ответа Калеба мы можем определить измененную git
команду, которая навсегда настроит все репозитории в этом каталоге правильно, так что все будущие использования vanilla git будут использовать новую конфигурацию. Я использую hub
, что является еще одной оболочкой git, поэтому я заменил my alias git=hub
на это и вызвал hub
мою функцию - если вы не используете hub
, замените все hub
вызовы на command git
:
function git() {
case "$PWD" in
/home/robin/git/3RD_PARTY)
hub "$@"
# We don't know which repository was cloned / operated on, so let's just reconfigure them all
for f in *; do
[[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
done
;;
/home/robin/git/3RD_PARTY/*)
hub "$@"
hub config user.email $my_private_email
;;
*)
hub "$@"
;;
esac
}
В отличие от ответа Калеба, который работает только в оболочке (и если явно не указано иное, то только в интерактивной оболочке), это также влияет на другие фронтенды git, которые правильно считывают конфигурацию git, например emacs magit.