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

18

Git поддерживает значения конфигурации на трех уровнях:

  • Глобальные настройки для системы (хранятся в /etc/git-core)
  • Пользовательские глобальные настройки (хранятся в ~/.gitconfig)
  • Локальные настройки репозитория (хранятся в $REPO/.git/config)

Эти параметры охватывают большую часть основы, но я ищу способ справиться с четвертым уровнем. У меня есть (очень) большая коллекция репозиториев, для которых мне нужно использовать значение, отличное user.emailот моего обычного. Эти репозитории часто создаются и обрабатываются с помощью автоматических сценариев, а настройка локальных настроек для каждого репозитория обременительна.

Все эти репозитории находятся под определенным префиксом пути в моей локальной системе. Есть ли способ установить значение конфигурации где-нибудь, которое будет унаследовано всеми репозиториями по этому пути? (Вроде как .htaccessнастройки одинаково наследуют всю файловую систему.) Возможно, есть способ установить условные значения в глобальном конфигурационном файле? Какие еще меры могут быть приняты в среде UNIX для работы с таким набором репозиториев, как мой?

Калеб
источник
Мой первый рефлекс - взломать скрипты для настройки .gitconfigв каждом каталоге, который они создают. Например, репо IIRC Android может сделать это, но вы должны внимательно прочитать источник, чтобы узнать. (Я не совсем уверен, я не делал этого в течение некоторого времени.)
Жиль "ТАК - перестань быть злым"
@ Жиль: Это, безусловно, возможно. Эти репозитории представляют собой репозиторий пакетов для дистрибутива Linux, который недавно был перенесен из CVS в Git. Мы все еще работаем над переделкой всех наших инструментов. В долгосрочной перспективе, вероятно, именно это и будет исправлено, но в краткосрочной перспективе те из нас, кто работает над этим, экспериментируют с вариантами.
Калеб

Ответы:

11

Я не нашел способа настроить git на этом четвертом уровне. Кажется, единственный способ - переопределение значений конфигурации для каждой команды git -c key=value.

Мое настоящее хакерское решение - определить функцию оболочки, которая служит оберткой для git. При вызове он передает аргументы в системную команду git, но не до проверки текущего рабочего каталога и добавления дополнительного аргумента в команду, если это применимо.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}
Калеб
источник
я могу сделать command git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"или как я должен идти об этом? Искал высоко и низко, и единственная ссылка на этот флаг -c, который я нашел, была вашей, спасибо, очень признателен.
Вик Голдфельд
к сведению, я получил его работать сcommand git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Вик Голдфельд
6

Вы можете настроить адрес электронной почты для git с помощью переменной среды GIT_AUTHOR_EMAIL. Если вы комбинируете это с выполнением сценариев bash при входе в конфигурацию каталога или конкретной оболочки с помощью zsh, вы можете легко изменить настройки для каждого каталога или родительского каталога, например, если вы войдете в каталог, ~/workвы можете автоматически настроить переменные среды, чтобы изменить свой адрес электронной почты. адрес.

Ульрих Дангел
источник
2

Смотрите решение на основе конфигурации git:

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositories/

Добавьте в файл «~ / .gitconfig»:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

Создайте файл «~ / .gitconfig-project1 ″ с содержимым:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  
ГИК
источник
Предикат includeIf избавляет меня от головной боли!
Чыонг Нгуен
1

Основываясь на ответе Калеба, мы можем определить модифицированную gitкоманду, которая постоянно правильно конфигурирует все репозитории в этом каталоге, так что все будущие использования vanilla git будут использовать новую конфигурацию. Я использую hub, что является еще одним git-оберткой, поэтому я заменил свой alias git=hubна this и вызвал 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.

Робин Грин
источник