Можно ли настроить конфигурацию git для нескольких репозиториев?

Можно ли настроить конфигурацию git для нескольких репозиториев?

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.

Связанный контент