Могу ли я указать несколько пользователей для себя в .gitconfig? - PullRequest
636 голосов
/ 19 ноября 2010

В моем ~/.gitconfig мой личный адрес электронной почты указан под [user], поскольку именно это я и хочу использовать для репозиториев Github.

Но я недавно начал использовать git и для работы. Git-репо моей компании позволяет мне фиксировать, но когда он рассылает объявления о новых наборах изменений, он говорит, что они от Anonymous, потому что он не распознает адрес электронной почты в моем .gitconfig - по крайней мере, это моя теория.

Можно ли указать несколько [user] определений в .gitconfig? Или есть какой-то другой способ переопределить значение по умолчанию .gitconfig для определенного каталога? В моем случае я проверяю весь рабочий код в ~/worksrc/ - есть ли способ указать .gitconfig только для этого каталога (и его подкаталогов)?

Ответы [ 20 ]

873 голосов
/ 19 ноября 2010

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

git config user.name "Your Name Here"
git config user.email your@email.com

, тогда как пользователь / адрес электронной почты по умолчанию настроен в вашем ~ / .gitconfig

git config --global user.name "Your Name Here"
git config --global user.email your@email.com
328 голосов
/ 27 апреля 2017

Поскольку git 2.13 , это можно решить с помощью недавно введенного Условно включает .

Пример:

Глобальная конфигурация ~ / .gitconfig

[user]
    name = John Doe
    email = john@doe.tld

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

Конкретный рабочий конфиг ~ / work / .gitconfig

[user]
    email = john.doe@company.tld
102 голосов
/ 12 апреля 2013

Или вы можете добавить следующую информацию в ваш локальный .git/config файл

[user]  
    name = Your Name
    email = your.email@gmail.com
38 голосов
/ 16 апреля 2014

После получения вдохновения от сообщения в блоге Орра Селлы я написал хук предварительной фиксации (находится в ~/.git/templates/hooks), который бы устанавливал конкретные имена пользователей и адреса электронной почты на основе информации внутри локального репозитория../.git/config:

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

[init]
    templatedir = ~/.git/templates

Тогда каждый git init или git clone подхватит этот хук иприменит данные пользователя в течение следующего git commit.Если вы хотите применить хук к уже существующим репо, просто запустите git init внутри репо, чтобы переинициализировать его.

Вот хук, который я придумал (он все еще нуждается в некоторой полировке - предложенияДобро пожаловать).Сохраните его как

~/.git/templates/hooks/pre_commit

или

~/.git/templates/hooks/post-checkout

и убедитесь, что он исполняемый: chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"


# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

РЕДАКТИРОВАТЬ:

Так что я переписал ловушку как ловушку и команду в Python.Кроме того, скрипт также можно вызывать как команду Git (git passport).Также возможно определить произвольное количество идентификаторов в конфигурационном файле (~/.gitpassport), которые можно выбрать в приглашении.Вы можете найти проект на github.com: git-passport - команда Git и хук, написанные на Python для управления несколькими учетными записями Git / идентификаторами пользователей .

37 голосов
/ 12 октября 2015

Одна команда переключения учетных записей github

Это решение принимает форму единого псевдонима git.После выполнения текущий пользователь проекта будет присоединен к другой учетной записи

Создание ключей SSH

ssh-keygen -t rsa -C "rinquin.arnaud@gmail.com" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "arnaud.rinquin@wopata.com" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

Свяжите их с вашими учетными записями GitHub / Bitbucket

  1. скопировать открытый ключ по умолчанию pbcopy < ~/.ssh/id_rsa.pub
  2. войти в свою учетную запись GitHub
  3. вставить ключ на странице add SSH key github
  4. скопируйте другой открытый ключ pbcopy < ~/.ssh/id_rsa_pro.pub
  5. , повторите и адаптируйте шаги 2–4 для каждой другой учетной записи

Шаг 1. Автоматическое переключение с помощью ssh-ключа.

Мы можем настроить ssh для отправки использования определенного ключа шифрования в зависимости от host.Приятно то, что вы можете иметь несколько псевдонимов для одного hostname.

См. Этот пример ~/.ssh/config file:

# Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

# Professional github alias
Host github_pro
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_pro

git remote config

Теперь вы можете использовать эти псевдонимы в git remotes, изменив git@github.com на git@github_pro.

Вы можете либо изменить существующие удаленные проекты (используя что-то вроде git remote set-url origin git@github_pro:foo/bar.git), либо адаптировать ихнепосредственно при их клонировании.

git clone git@github.com:ArnaudRinquin/atom-zentabs.git

с использованием псевдонима становится:

git clone git@github_pro:ArnaudRinquin/atom-zentabs.git

Шаг 2. Изменение пользователя git.email

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

git config user.email 'arnaud.rinquin@wopata.com'

Хотя это легко, но для разработчиков нам не хватает времени.Для этого мы можем написать очень простой псевдоним git.

Мы собираемся добавить его в файл ~/.gitconfig.

[user]
    name = Arnaud Rinquin
    email = rinquin.arnaud@gmail.com

...

[alias]
    setpromail = "config user.email 'arnaud.rinquin@wopata.com'"

Затем все, что нам нужно сделать, это git setpromailчтобы наша электронная почта была изменена только для этого проекта.

Шаг 3. Пожалуйста, включите один командный переключатель?!

Не было бы неплохо переключиться с учетной записи по умолчанию науказан с помощью одной команды без параметров?Это определенно возможно.Эта команда будет состоять из двух шагов:

  • изменить текущий псевдоним проекта на выбранные псевдонимы
  • изменить текущий проект user.email config

У нас уже естьодно командное решение для второго шага, но первый намного сложнее.Одна команда удаленного изменения хоста

Вот решение в виде другой команды git alias для добавления к ~/.gitconfig:

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"

Это позволяет переключать все удаленные компьютеры с одного хоста на другой.(псевдоним).Смотрите пример:

$ > git remote -v
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (push)

$ > git changeremotehost github.com github_pro

$ > git remote -v
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (push)

Объедините их все

Теперь нам просто нужно объединить две команды в одну, это довольно просто.Посмотрите, как я также интегрирую коммутацию хоста битбакета.

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
  setpromail = "config user.email 'arnaud.rinquin@wopata.com'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

Ссылка на источник - Руководство

24 голосов
/ 20 августа 2015

Если вы не хотите иметь адрес электронной почты по умолчанию ( адрес электронной почты ссылается на пользователя github ), вы можете настроить, что вы хотите, чтобы вас спрашивали.То, как вы можете это сделать, зависит от версии используемого вами git, см. Ниже.

(Предполагаемый) недостаток заключается в том, что вам необходимо настроить свой адрес электронной почты (и ваше имя) один раз для каждого хранилища.Таким образом, вы не можете забыть сделать это.

Версия <2.7.0 </h2> [user] name = Your name email = "(none)" в вашей глобальной конфигурации ~/.gitconfig, как указано в комментарии Дэна Алони в Орра Селлысообщение в блоге .При попытке сделать первый коммит в репозитории, git завершается неудачно с хорошим сообщением: *** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository. fatal: unable to auto-detect email address (got '(none)') Имя взято из глобальной конфигурации, когда адрес электронной почты установлен локально (сообщение не совсем точно). 2.7.0 ≤ Версия <2.8.0 </h2> Поведение в версиях <2.7.0 не было предназначено и исправлено в 2.7.0.Вы все еще можете использовать ловушку перед фиксацией, как описано в <a href="https://orrsella.com/2013/08/10/git-using-different-user-emails-for-different-repositories/"> сообщении Орра Селлы в блоге .Это решение работает и для других версий, но другие решения не для этой версии. Версия ≥ 2.8.0

Дэн Алони добавил возможность добиться такого поведения (см. примечания к выпуску ).Используйте его с:

[user]
    useConfigOnly = true

Чтобы заставить его работать, вы не можете указывать имя или адрес электронной почты в глобальной конфигурации.Затем, при первом коммите, вы получаете сообщение об ошибке

fatal: user.useConfigOnly set but no name given

Так что сообщение не очень поучительно, но, поскольку вы явно задаете опцию, вы должны знать, что делать.В отличие от решения версий <2.7.0, вам всегда нужно указывать имя и адрес электронной почты вручную. </p>

17 голосов
/ 03 октября 2014

Еще один вариант заставить git работать с несколькими именами / электронными письмами - использовать псевдоним git и использовать флаг -c для переопределения глобальной и специфичной для репозитория конфигурации.

Например, определив псевдоним:

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

Чтобы увидеть, работает ли он, просто наберите git config user.email:

$ git config user.email
name@example.com

Вместо псевдонима вы также можете поместить пользовательский git исполняемый файл в $PATH.

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

Преимущество этого метода перед специфичным для репозитория .git/config заключается в том, что он применяется к каждому репозиторию git, когда активна пользовательская программа git. Таким образом, вы можете легко переключаться между пользователями / именами без изменения какой-либо (общей) конфигурации.

14 голосов
/ 18 мая 2017

С условным включением в Git 2.13, теперь возможно иметь несколько пользователей / электронную почту, сосуществующих на одном компьютере без особых усилий.

user.gitconfig имеет мое личное имя и адрес электронной почты. work-user.gitconfig имеет мое рабочее имя и адрес электронной почты. Оба файла находятся на ~ пути.

Таким образом, мое личное имя / адрес электронной почты применяются по умолчанию. Для c:/work/ dir применяется мое рабочее имя / адрес электронной почты. Для c:/work/github/ dir применяется мое личное имя / адрес электронной почты. Это работает, когда применяются последние настройки.

# ~/.gitconfig
[include]
    path = user.gitconfig
[includeIf "gitdir/i:c:/work/"]
    path = work-user.gitconfig
[includeIf "gitdir/i:c:/work/github/"]
    path = user.gitconfig

gitdir чувствителен к регистру, а gitdir/i нечувствителен к регистру.

"gitdir/i:github/" будет применять условное включение для любого каталога с github в своем пути.

9 голосов
/ 25 марта 2017

псевдонимы git (и разделы в git-конфигах) для спасения!

добавьте псевдоним (из командной строки):

git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; :'

затем установите, например,

git config --global user.github.name "your github username"
git config --global user.github.email your@github.email

, и в новом или клонированном репо вы можете выполнить эту команду:

git identity github

Это решение не автоматическое, а отключение пользователя и электронной почты в глобальном ~/.gitconfig и настройка user.useConfigOnlytrue заставит git напомнить вам о необходимости устанавливать их вручную в каждом новом или клонированном репо.

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true
9 голосов
/ 09 марта 2016

Существует простое решение, которое, кажется, хорошо работает для избежания ошибок.

Просто удалите секцию [user] из вашего ~/.gitconfig, что помешает вам совершать любые коммиты без установки user.name длякаждый репозиторий.

В вашем ~/.bashrc добавьте несколько простых псевдонимов для пользователя и электронной почты:

alias ggmail='git config user.name "My Name";git config user.email me@gmail.com'
alias gwork='git config user.name "My Name";git config user.email me@work.job'
...