Используйте разные user.email и user.name для конфигурации Git на основе URL удаленного клона

Я настраиваю свой глобальный ~/.gitconfig свойства user.name а также user.email как это:

git config --global user.email "mkobit@example.com" 
git config --global user.name "mkobit"

Это конфигурация по умолчанию, которую я хочу для работы над личными проектами, с открытым исходным кодом и т. Д.

Когда я работаю над проектом из определенного домена, например, корпоративного домена, я настраиваю его для каждого репозитория, когда клонирую его, чтобы он использовал другой user.name/user.email:

git clone ssh://git@git.mycorp.com:1234/groupA/projectA.git
cd projectA
git config user.email "mkobit@mycorp.com"
git config user.name "m.kobit"

Одним из приличных вариантов будет установка псевдонима для клонирования таких репозиториев:

git config --global alias.clonecorp 'clone \ 
        -c user.name="m.kobit" -c user.email="mkobit@mycorp.com"'
git clonecorp ssh://git@git.mycorp.com:1234/groupA/projectA.git

Оба из них могут быть подвержены ошибкам, потому что они оба зависят от того, насколько я умен и правильно следую. Факты показывают, что это почти гарантировано для меня когда-нибудь облажаться.

Есть ли способ настроить Git таким образом, чтобы репозитории из определенного домена (mycorp.com в этом примере) будет настроен определенный путь?

4 ответа

Решение

В выпуске Git 2.13 появилась функция условных включений. В 2.13 единственной поддерживаемой конфигурацией является путь к файловой системе. Это легко использовать в этом случае, потому что я уже разделяю их.

Пример, приведенный в примечаниях к выпуску:

Вы можете настроить два условных включения в вашем домашнем каталоге ~/.gitconfig файл:

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

Теперь вы можете поместить любые параметры в эти файлы:

$ cat ~/.gitconfig-work
[user]
name = Serious Q. Programmer
email = serious.programmer@business.example.com

$ cat ~/.gitconfig-play
[user]
name = Random J. Hacker
email = rmsfan1979@example.com

Старый ответ

В Git 2.8 глобальная конфигурация user.useconfigonly было добавлено, что пользователь настаивает на user.email а также user.name устанавливаются до совершения. Вот соответствующий текст из связанного сообщения в блоге от Github:

Но если, скажем, вы хотите, чтобы Git использовал один адрес электронной почты для ваших проектов с открытым исходным кодом, а другой - для ваших рабочих проектов, вы, несомненно, допустили ошибку, приняв участие в создании нового репозитория Git, не задав предварительно свой адрес электронной почты. репозиторий. В этой ситуации Git выдает предупреждение, но в любом случае создает коммит, используя адрес электронной почты, который он угадывает по имени хоста локальной системы. Если вы пытаетесь сделать что-то настолько сложное, как разные адреса для разных проектов, это почти наверняка не то, что вам нужно.

Теперь вы можете сказать Git не угадывать, а настаивать на том, чтобы вы явно указали user.name и user.email, прежде чем он позволит вам совершить коммит:

git config --global user.useconfigonly true

Это не решает автоматическую настройку, основанную на определенных URL-адресах клонирования, но делает процесс чуть менее подверженным ошибкам, форсируя настройку в начале.

начиная с 2.36.0 git теперь поддерживает это по удаленному URL-адресу

~/.gitconfig файл:

      [includeIf "hasconfig:remote.*.url:git@github.com*/**"]
    path = .gitconfig-public
[includeIf "hasconfig:remote.*.url:git@ghe.corp.lol*/**"]
    path = .gitconfig-work

Затем добавьте свою настройку в указанные выше конфиги.

Я оказался в той же ситуации: осознав, что я использовал свою корпоративную электронную почту для коммитов сразу после отправки в не корпоративные репозитории... Итак, я написал небольшой git-хук, который также может оказаться полезным: https://github.com/DrVanScott/git-clone-init

На основе настраиваемого файла шаблона он инициализирует user.email и user.name в git clone.

Когда я работаю над проектом из определенного домена, например, корпоративного домена, я настраиваю его для каждого репозитория, когда клонирую его

Обязательно используйте Git 2.22 (Q2 2019), если ваше условие включает в себя конфигурацию IncludeIf использует шаблон:

См. Коммит 19e7fda (26 марта 2019 г.) Нгуен Тай Нгук Дуй ( pclouds )
(Объединено Юнио С Хамано - gitster - в коммите 078b254 от 22 апреля 2019 г.)

config: правильный ' ** в соответствии includeIf узоры

Электрический ток wildmatch() звать includeIf шаблон gitdir не проходит WM_PATHNAME флаг.
Без этого флага * 'рассматривается почти так же, как' ** ' (так как ' * 'также соответствует косой черте) с одним исключением:

' /**/ 'может соответствовать один слеш.
Шаблон ' foo/**/bar ' Матчи ' foo/bar ".

Но ' /*/ ', что, по сути, то, что движок wildmatch видит без WM_PATHNAME, должен соответствовать две косые черты (и ' * 'ничего не соответствует).
Что значит ' foo/*/bar "не может совпадать" foo/bar ".
Это может только соответствовать foo//bar ".

Результатом этого является текущий wildmatch() Call работает большую часть времени, пока пользователь зависит от /**/ 'не соответствует компоненту пути.
А также ' * 'совпадает с косой чертой, хотя не должно, но люди, вероятно, еще не заметили этого. Исправление просто.

Другие вопросы по тегам