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

Можно ли настроить 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, что делает его более переносимым. Может быть?

4b9b3361

Ответ 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]"