4

В моем файле .zshrc меня есть функция chpwd которая устанавливает переменную среды GIT_CONFIG на основе текущего пути.

Что-то вроде этого:

update_gitconfig() {
  if [[ "$(pwd | grep -Poe '^/home/user/repositories/user-A(/|$)')" != "" ]]
  then
    export GIT_CONFIG="$HOME/.gitconfig-A"
    return
  fi

  if [[ "$(pwd | grep -Poe '^/home/user/repositories/user-B(/|$)')" != "" ]]
  then
    export GIT_CONFIG="$HOME/.gitconfig-B"
    return
  fi

  export GIT_CONFIG="$HOME/.gitconfig-default"
}

update_gitconfig
chpwd_functions+=(update_gitconfig)

Если я запускаю git config --list , он отображает ожидаемую конфигурацию в каждом каталоге:

  • В $HOME/repositories/user-A отображаются параметры из $HOME/.gitconfig-A .
  • В $HOME/repositories/user-B отображаются параметры из $HOME/.gitconfig-B .
  • В другом месте он отображает настройки из $HOME/.gitconfig-default .

Проблема начинается, когда я запускаю git commit ; кажется, что не получить настройки:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'user@host.(none)')

Итак, вопрос в следующем:

Есть ли способ заставить git commit получить информацию из файла $GIT_CONFIG ?

ПРИМЕЧАНИЕ: я знаю, что могу запустить команды git config в chpwd чтобы автоматически применять локальные настройки к каждому репозиторию, но я ищу более "элегантный" способ.

1 ответ1

2

Замечание к выпуску Git v1.6.0 содержит подсказку:

GIT_CONFIG, which was only documented as affecting "git config", but
actually affected all git commands, now only affects "git config".

И git v1.8.2 исправляет это новое поведение для команды git clone которое все еще было затронуто.

Обходные пути, которые я вижу интересными:

  • Используйте git с таким количеством пользователей, которое может понадобиться (инструмент командной строки su может помочь).
  • Написание псевдонимов, таких как alias gitcommit='git commit --author=$(git config user.email)' (безобразно).
  • Скопируйте ваш файл конфигурации в ваши локальные конфигурации репо (любая модификация конфигурации должна распространяться вручную).
  • Ложный поиск ~/.gitconfig через переопределение переменной среды HOME . Пример: HOME=~/.gitconfig/user-a/ git commit должен прочитать ~/.gitconfig/user-a/.gitconfig (может иметь некоторые другие побочные эффекты).

Также, если вы используете chpwd zsh hook, будьте осторожны, чтобы поддерживать несколько zsh, работающих в нескольких репозиториях.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .