Можно ли настроить user.name и user.email для подстановочных доменов в .gitconfig?
У меня есть рабочий компьютер, и он настроен во всем мире для использования моего рабочего письма и имени при совершении. Это хорошо. Тем не менее, я хотел бы сделать какое-то правило, в котором говорится: "Если источником репо является github, используйте пользователя X и адрес электронной почты Y"
Я понимаю, что вы можете сделать запись в config для каждого репозитория, но я бы хотел, чтобы он был более автоматическим: если клон является github, он должен использовать детали пользователя github. Если я клонирую с работы, он должен использовать детали работы.
Есть ли способ настроить это глобально на основе удаленного домена? Или другим способом?
ИЗМЕНИТЬ/UPDATE
Я принял ответ ниже, но немного изменил script:
#!/usr/bin/env bash
# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | sed -n 2p)
# Does the remote "origin" point to GitHub?
if ("$REAL_GIT" remote -v 2>/dev/null | grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then
# Yes. Set username and email that you use on GitHub.
export GIT_AUTHOR_NAME=$("$REAL_GIT" config --global user.ghname)
export GIT_AUTHOR_EMAIL=$("$REAL_GIT" config --global user.ghemail)
fi
"$REAL_GIT" "[email protected]"
Основное дополнение - это требование для двух значений git config
.
git config --global user.ghname "Your Name"
git config --global user.ghemail "[email protected]"
Это позволяет избежать жесткого кодирования значений в script, что делает его более переносимым. Может быть?
Ответы
Ответ 1
В Git нет ничего, чтобы сделать это (насколько я знаю), но следующая оболочка script работает довольно надежно. Измените его, чтобы иметь имя пользователя и адрес электронной почты, которые вы хотите, при проверке в GitHub, а затем сохраните его как исполняемый файл с именем "git" на вашем пути где-то до "реального" git.
#!/usr/bin/env bash
# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | sed -n 2p)
# Does the remote "origin" point to GitHub?
if ("$REAL_GIT" remote -v 2>/dev/null |
grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then
# Yes. Set username and email that you use on GitHub.
export GIT_AUTHOR_NAME='*** put your name here ***'
export GIT_AUTHOR_EMAIL='*** put your email address here ***'
fi
"$REAL_GIT" "[email protected]"
Я использую подобный трюк с ssh
на моей машине - я хочу, чтобы ssh менял цвет фона моего окна при его запуске, а затем менял его обратно, когда он выходил - и он работал надежно для меня.
Кроме того, обратите внимание, что это жестко закодировано, чтобы смотреть только на удаленный компьютер с именем origin
.
Ответ 2
Я написал post-checkhout hook, чтобы установить локальные данные репо на основе исходного URL-адреса репозитория.
Он не использует подстановочные домены, хотя использует git config --urlmatch
, который предположительно вернется к ближайшему совпадающему URL.
Посмотрите здесь: https://github.com/boywhoroared/dotfiles/blob/master/git/template/hooks/post-checkout.d/author
Ответ 3
Git 2.13 добавляет поддержка условной конфигурации включает. Если вы организуете свои проверки в каталогах для каждого домена работы, вы можете добавить пользовательские настройки в зависимости от того, где находятся выписки. В глобальной конфигурации git:
[includeIf "gitdir:code/work/"]
path = /Users/self/code/work/.gitconfig
И затем в ~/code/work/.gitconfig:
[user]
email = [email protected]
И, конечно же, вы можете сделать это для как можно большего количества областей работы.
Ответ 4
user.name
и user.email
используются для "подписи" ваших коммитов. Поскольку commits репо-независимы (скажем, одна и та же фиксация будет во множестве разных репозиций, когда вы их нажимаете), эти свойства не зависят от удаленной системы.
Что вы можете сделать, так это установить различные протоколирования при подключении к различным пультам через https. Вы просто поместите имя пользователя в URL-адрес в форме https://[email protected]/path/to/repo.git
, и все будет готово.
Но автор фиксации будет тем же самым user.name
, потому что коммиты сделаны локально, а затем просто передаются другим.
Поскольку коммитер-идентификатор является частью фиксации, если вы делаете две коммиты, которые являются одинаковыми, за исключением имени комминера и электронной почты, эти коммиты будут иметь разные хэши, поэтому они будут двумя различными фиксациями для git в все. Это было бы беспорядок:)
Если вы действительно хотите сделать это, возможно, вы можете сделать что-то с помощью перехватчиков, которые подталкивают ваши коммиты к другому репо на вашем компьютере, и это другое репо (через перехваты, снова) будет переписываться коммит, изменение автора и нажатие на другой пульт.
Но это так противно, что я откажусь сказать вам об этом;)
Ответ 5
Как и в Майк отвечает, но благодаря команде uniq
в четвертой строке это не приведет к вилкой, даже если вы запустите оболочку внутри оболочки.
#!/usr/bin/env bash
# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | uniq | sed -n 2p)
# Does the remote "origin" point to GitHub?
if ("$REAL_GIT" remote -v 2>/dev/null |
grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then
# Yes. Set username and email that you use on GitHub.
export GIT_AUTHOR_NAME='*** put your name here ***'
export GIT_AUTHOR_EMAIL='*** put your email address here ***'
fi
"$REAL_GIT" "[email protected]"