Подтвердить что ты не робот

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

Я настраиваю свои глобальные свойства ~/.gitconfig user.name и user.email следующим образом:

git config --global user.email "[email protected]" 
git config --global user.name "mkobit"

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

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

git clone ssh://[email protected]:1234/groupA/projectA.git
cd projectA
git config user.email "[email protected]"
git config user.name "m.kobit"

Один подходящий вариант - установить псевдоним для клонирования таких хранилищ:

git config --global alias.clonecorp 'clone \ 
        -c user.name="m.kobit" -c user.email="[email protected]"'
git clonecorp ssh://[email protected]:1234/groupA/projectA.git

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

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

4b9b3361

Ответ 1

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

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

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

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

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

$ cat ~/.gitconfig-work
[user]
name = Serious Q. Programmer
email = [email protected]

$ cat ~/.gitconfig-play
[user]
name = Random J. Hacker
email = [email protected]

Старый ответ

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

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

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

git config --global user.useconfigonly true

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

Ответ 2

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

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

Ответ 3

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

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

См. Коммит 19e7fda (26 марта 2019 г.) Нгуен Тай pclouds Дуй (pclouds).
(Объединено Junio C Hamano - 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() работает большую часть времени, пока пользователь не будет зависеть от ' /**/ ', не соответствующей ни одному компоненту пути.
Кроме того, ' * ' соответствует косой черте, хотя этого не должно быть, но люди, вероятно, этого еще не заметили. Исправление просто.