Чи можна встановити конфігурацію git у кількох сховищах?


18

Здається, Git підтримує значення конфігурації на трьох рівнях:

  • Загальні глобальні налаштування (зберігаються в /etc/git-core)
  • Глобальні налаштування для користувачів (зберігаються в ~/.gitconfig)
  • Локальні налаштування для репозиторію (зберігаються в $REPO/.git/config)

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

Усі схожі сховища знаходяться під певним префіксом шляху в моїй локальній системі. Чи існує спосіб десь встановити значення конфігурації, яке буде успадковано всіма сховищами під цим контуром? (Начебто подібні .htaccessналаштування успадковують весь шлях до файлової системи.) Можливо, був би спосіб встановити умовні значення у глобальному файлі конфігурації? Які ще домовленості можна було б укласти в середовищі UNIX для вирішення набору сховищ, таких як моє?


Мій перший рефлекс - зламати сценарії, щоб підлаштуватись .gitconfigу кожній створеній ними каталозі. Наприклад, IIRC Андроїда репо може зробити це, але ви повинні уважно прочитати джерело , щоб дізнатися. (Я не зовсім впевнений, я цього не робив давно.)
Жил "ТАК - перестань бути злим"

@Gilles: Це, безумовно, можливість. Репост, про який йдеться, є сховищем пакетів для дистрибутива Linux, який нещодавно перейшов з CVS в Git. Ми все ще працюємо над переробкою всіх наших інструментів. У перспективі, мабуть, це і вирішується, але в короткий термін ті з нас, хто працює над цим, експериментують, які варіанти є.
Калеб

Відповіді:


11

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

Моє поточне хакі рішення - визначити функцію оболонки, яка служить оболонкою для git. При виклику він передає аргументи команді system 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. Якщо ви поєднаєте це з Execute 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 with із вмістом:

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

    [user]  
      name = user1  
      email = user1@email.com  

предикат "includeIf" рятує мій головний біль!
Труонг Нгуен

1

Виходячи з відповіді Калеба, ми можемо визначити модифіковану gitкоманду, яка постійно налаштовує всі сховища в цьому каталозі правильно, так що всі майбутні використання ванільного git будуть використовувати нову конфігурацію. Я використовую hub, що є ще однією git обгорткою, тому я замінив своє 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.