Могу ли я указать несколько пользователей для себя в.gitconfig?

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

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

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

24 ответа

Решение

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

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

Начиная с 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

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

[user]  
    name = Your Name
    email = your.email@gmail.com

Переключатель учетных записей 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 файл:

# 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 Configuration

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

Вы можете изменить существующие удаленные проекты (используя что-то вроде git remote origin set-url 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 user.email

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

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)

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

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

[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\"

Ссылка на источник - Учебное пособие

С помощью условных включений в 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 на своем пути.

После получения вдохновения от поста в блоге Орра Селлы я написал хук перед фиксацией (находится в ~/.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 / идентификацией пользователей.

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

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

Версия < 2.7.0

[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

Поведение в версиях < 2.7.0 не было предназначено и исправлено с 2.7.0. Вы все еще можете использовать ловушку перед фиксацией, как описано в блоге Орра Селлы. Это решение работает и для других версий, но другие решения не для этой версии.

Версия ≥ 2.8.0

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

[user]
    useConfigOnly = true

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

fatal: user.useConfigOnly set but no name given

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

Прочитав все ответы, я пришел к такому решению:

Сценарий:

  • Локальная ОС: Linux (bash)
  • два аккаунта на GitHub (рабочий / личный)
  • доступ по ssh с разными ключами
  • моя рабочая учетная запись будет "основной" (поэтому настраивать ее не нужно)

Конфигурация:

  1. Установите «фальшивый» хост, который позволяет мне выбрать правильную пару ключей SSH.
    В ~/.ssh/config:
            # Personal GitHub account
    Host github-personal
      HostName github.com
      User git
      IdentityFile ~/.ssh/id_rsa_personal
      IdentitiesOnly yes
    
  2. «Скажите» мерзавец его следует использовать пользовательскую конфигурацию в пределах данного каталога поддерева:
    At ~/.gitconfig:
            # My personal projects
    [includeIf "gitdir/i:~/REPOS/PERSONAL/"]
       path = ~/REPOS/PERSONAL/personal.gitconfig
    
    
  3. Наконец, моя конфигурация по адресу:
            # gitconfig for personal projects
    [user]
      email = personalemail@example.com
    
    [url "git@github-personal"]
      insteadOf = git@github.com
    

После того, как три вышеперечисленных будут выполнены, я могу клонировать личное репо следующим образом:

      user@host:~/REPOS/PERSONAL$ git clone git@github.com:jmnavarrol/python-multigit.git
Cloning in 'python-multigit'...
(...)
user@host:~/REPOS/PERSONAL$ cd python-multigit && git remote -v
origin  git@github-personal:jmnavarrol/python-multigit.git (fetch)
origin  git@github-personal:jmnavarrol/python-multigit.git (push)
user@host:~/REPOS/PERSONAL/python-multigit$

Добавление переписывания URL на ~/REPOS/PERSONAL/personal.gitconfig...

      [url "git@github-personal"]
  insteadOf = git@github.com

... это то, что позволяет мне ссылаться на репо только по его "стандартному" URL в скриптах, подрепо (то есть в случае самого python-multigit - да, неубедительная попытка небольшого саморекламы), не рискуя использовать "неправильный" URL-адреса, следовательно, неправильная аутентификация.

Мои два цента.

Еще один вариант получить 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 Программа активна. Таким образом, вы можете легко переключаться между пользователями / именами без изменения какой-либо (общей) конфигурации.

Git псевдонимы (и разделы в Git Configs) на помощь!

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

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 заставит git напомнить вам об их установке вручную в каждом новом или клонированном репо.

git config --global --unset user.name
git config --global --unset user.email

Этот ответ частично вдохновлен публикацией @Saucier, но я искал автоматический способ установки user.name а также user.email на основе репо, на основе удаленного, это было немного легче, чем пакет git-passport, который он разработал. Также h/t в @John для установки useConfigOnly. Вот мое решение:

.gitconfig изменения:

[github]
    name = <github username>
    email = <github email>
[gitlab]
    name = <gitlab username>
    email = <gitlab email>
[init]
    templatedir = ~/.git-templates
[user]
    useConfigOnly = true

хук post-checkout, который следует сохранить по следующему пути: ~/.git-templates/hooks/post-checkout:

#!/usr/bin/env bash

# make regex matching below case insensitive
shopt -s nocasematch

# values in the services array should have a corresponding section in
# .gitconfig where the 'name' and 'email' for that service are specified
remote_url="$( git config --get --local remote.origin.url )"
services=(
    'github'
    'gitlab'
)

set_local_user_config() {
    local service="${1}"
    local config="${2}"
    local service_config="$( git config --get ${service}.${config} )"
    local local_config="$( git config --get --local user.${config} )"

    if [[ "${local_config}" != "${service_config}" ]]; then
        git config --local "user.${config}" "${service_config}"
        echo "repo 'user.${config}' has been set to '${service_config}'"
    fi
}

# if remote_url doesn't contain the any of the values in the services
# array the user name and email will remain unset and the
# user.useConfigOnly = true setting in .gitconfig will prompt for those
# credentials and prevent commits until they are defined
for s in "${services[@]}"; do
    if [[ "${remote_url}" =~ "${s}" ]]; then
        set_local_user_config "${s}" 'name'
        set_local_user_config "${s}" 'email'
        break
    fi
done

Я использую разные учетные данные для github и gitlab, но эти ссылки в приведенном выше коде могут быть заменены или дополнены любым сервисом, который вы используете. Чтобы хук после проверки автоматически установил имя пользователя и адрес электронной почты локально для репо после проверки, убедитесь, что имя службы отображается в удаленном URL-адресе, добавьте его в массив служб в поле post-checkout сценарий и создать раздел для него в вашем .gitconfig который содержит ваше имя пользователя и адрес электронной почты для этой услуги.

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

Вот то, что я только что нашел после выполнения шагов во многих ответах здесь

Как настроить параметры нескольких ключей SSH для другой учетной записи GitHub

Возможно, вы захотите начать проверку сохраненных в данный момент ключей $ ssh-add -l

Если вы решили удалить все кэшированные ключи ранее (необязательно, позаботьтесь об этом) $ ssh-add -D

Затем вы можете создать ключ ssh pub/priv, связанный с каждым письмом / учетной записью, которые вы хотите / должны использовать

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "work@company.com" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "pers@email.com" <-- save it as "id_rsa_pers"

После выполнения этих команд у вас будут созданы следующие файлы

~/.ssh/id_rsa_work      
~/.ssh/id_rsa_work.pub

~/.ssh/id_rsa_pers
~/.ssh/id_rsa_pers.pub 

Убедитесь, что агент аутентификации запущен

$ eval `ssh-agent -s`

Добавьте сгенерированные ключи следующим образом (из папки ~/.ssh)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

Теперь вы можете проверить сохраненные ключи снова

$ ssh-add -l

Теперь вам нужно добавить сгенерированные открытые ключи на ваш сервер github/bickbuket Acces Keys

Клонировать каждый репозиторий в разные папки

Перейдите в папку, где будет использоваться работа пользователя, и сделайте это

$ git config user.name "Working Hard"
$ git config user.email "work@company.com" 

Просто чтобы увидеть, что это делает, проверьте содержимое ".git/config"

Перейдите в папку, где будет использоваться пользователь activehacker, и сделайте это

$ git config user.name "Personal Account"
$ git config user.email "pers@email.com" 

Просто чтобы увидеть, что это делает, проверьте содержимое ".git/config"

После всего этого вы сможете зафиксировать свой личный и рабочий код, переключая папки

Если у вас есть какие-либо проблемы, дайте мне знать mgg.isco@gmail.com

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

Просто удалите [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'

GIT_AUTHOR_EMAIL + местный .bashrc

.bashrc_local: не отслеживайте этот файл, поместите его только на рабочий компьютер:

export GIT_AUTHOR_EMAIL='me@work.com'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc: отследите этот файл, сделайте его одинаковым на рабочем и домашнем компьютерах:

F="$HOME/.bashrc_local"
if [ -r "$F" ]; then
    . "$F"
fi

Я использую https://github.com/technicalpickles/homesick для синхронизации моих точечных файлов.

Если только gitconfig будет принимать переменные окружения: Расширение переменных оболочки в git config

Окружающая среда Windows

Дополнительно это может быть изменено с Git Extensions --> Settings --> Global Settings, если он установлен в ваших системах.

gitextensions-последний релиз

Щелкните правой кнопкой мыши папку / каталог в среде Windows, чтобы получить доступ к этим настройкам.

Обновление: Как переключить / сохранить несколько настроек в версии 2.49 Как переключить / сохранить несколько настроек в версии 2.49

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

Шаги

  1. Перейдите в папку c:\users\Ваш пользователь\.ssh.
  2. сенсорный конфиг
  3. Настройте ключи ssh для каждого домена

  1. Перейдите в репозиторий git, используя gitbash.
  2. Настройте имя пользователя и имя для каждого репо "git config user.email="abc@gmail.com"
  3. Настройте имя для каждого репо. git config user.name="Mo Sh"
  4. Выполнение git-команд. он автоматически выберет ключи SSH.

Может быть, это простой взлом, но это полезно. Просто сгенерируйте 2 ssh-ключа, как показано ниже.

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/GowthamSai/.ssh/id_rsa): work
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in damsn.
Your public key has been saved in damsn.pub.
The key fingerprint is:
SHA256:CrsKDJWVVek5GTCqmq8/8RnwvAo1G6UOmQFbzddcoAY GowthamSai@Gowtham-MacBook-Air.local
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

Таким же образом создайте еще один для личного. Итак, у вас есть 2 ключа SSH, работа и компания. Скопируйте work.pub, work, personal.pub, personal в ~ /.ssh / Directory.

Затем создайте сценарий оболочки со следующими строками и назовите его как crev.sh (Company Reverse) со следующим содержимым.

cp ~/.ssh/work ~/.ssh/id_rsa
cp ~/.ssh/work.pub ~/.ssh/id_rsa.pub

Таким же образом создайте еще один файл с именем prev.sh (Personal Reverse) со следующим содержимым.

cp ~/.ssh/personal ~/.ssh/id_rsa
cp ~/.ssh/personal.pub ~/.ssh/id_rsa.pub

в ~/.bashrc добавьте псевдонимы для этих скриптов, как показано ниже

alias crev="sh ~/.ssh/crev.sh"
alias prev="sh ~/.ssh/prev.sh"
source ~/.bashrc

Когда вы хотите использовать компанию, просто делайте Crev, а если вы хотите использовать личный, сделайте пред.

Добавьте эти ключи ssh в свои учетные записи на github. Убедитесь, что у вас нет сгенерированного идентификатора id_rsa, потому что эти скрипты будут перезаписывать id_rsa. Если вы уже сгенерировали id_rsa, используйте это для одной из учетных записей. Скопируйте их как личные и пропустите генерацию личных ключей.

Вы также можете использовать git commit --author "Your Name <your@email.com>" в момент совершения коммита в репо, где вы хотите коммитить как другой пользователь.

Несмотря на то, что большинство вопросов вроде отвечало на ОП, мне просто пришлось пройти через это самостоятельно, и, даже не взглянув на гугл, я смог найти самое быстрое и простое решение. Вот простые шаги:

  • скопировать существующий .gitconfg из вашего другого репо
  • вставить в недавно добавленный репо
  • изменить значения в .gitconfig файл, такой как имя, адрес электронной почты и имя пользователя [user] name = John email = john@email.net username = john133
  • добавить имя файла в .gitignore список, чтобы убедиться, что вы не делаете .gitconfig файл в вашу рабочую репо

Я сделал функцию bash, которая справится с этим. Вот репозиторий Github.

Для записи:

# Look for closest .gitconfig file in parent directories
# This file will be used as main .gitconfig file.
function __recursive_gitconfig_git {
    gitconfig_file=$(__recursive_gitconfig_closest)
    if [ "$gitconfig_file" != '' ]; then
        home="$(dirname $gitconfig_file)/"
        HOME=$home /usr/bin/git "$@"
    else
        /usr/bin/git "$@"
    fi
}

# Look for closest .gitconfig file in parents directories
function __recursive_gitconfig_closest {
    slashes=${PWD//[^\/]/}
    directory="$PWD"
    for (( n=${#slashes}; n>0; --n ))
    do
        test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return 
        directory="$directory/.."
    done
}


alias git='__recursive_gitconfig_git'

Для этого может быть несколько способов, но я добиваюсь этого с помощью функции оболочки ниже.

Вызывая это как,

gitprofile "public" -> Это переключит на профиль с tom@gmail.com а также

gitprofile "private" -> Это переключится на tom@workmail.com.

Добавьте эту функцию в свой ~ / .bash_profile или ~ / .zshrc в зависимости от ваших текущих настроек терминала. Перезагрузите терминал или просто скомпилируйте скрипт, например

. ~ / .bash_profile

чтобы сделать функцию эффективной. Надеюсь, поможет !

Давайте переопределим спецификации - вы просто хотите иметь возможность использовать несколько идентификаторов с git против разных организаций - все, что вам нужно, это 2 одинарных строки:

       # generate a new private public key pair for org1  
 email=me@org1.eu;ssh-keygen -t rsa -b 4096 -C $email -f $HOME/.ssh/id_rsa.$email

 # use org1 auth in THIS shell session - Ctrl + R, type org1 in new one 
 email=me@org1.eu;export GIT_SSH_COMMAND="ssh -p 22 -i ~/.ssh/id_rsa.$email"

Почему я знаю, что это, безусловно, самое простое решение:

        # me using 9 different orgs with separate git auths dynamically
  find $HOME/.ssh/id_rsa.*@* | wc -l
  18

Что-то вроде ответа Роба В., но допускает использование другого ключа ssh и работает со старыми версиями git (в которых нет, например, конфигурации core.sshCommand).

Я создал файл ~/bin/git_poweruser, с исполняемым разрешением и в PATH:

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

cat > $TMPDIR/ssh << 'EOF'
#!/bin/bash
ssh -i $HOME/.ssh/poweruserprivatekey $@
EOF

chmod +x $TMPDIR/ssh
export GIT_SSH=$TMPDIR/ssh

git -c user.name="Power User name" -c user.email="power@user.email" $@

Всякий раз, когда я хочу зафиксировать или выдвинуть что-либо как "Опытный пользователь", я использую git_poweruser вместо git, Он должен работать в любом каталоге и не требует изменений в .gitconfig или же .ssh/configпо крайней мере не в моем.

Просто добавьте это в ваш ~/.bash_profile, чтобы переключаться между ключами по умолчанию для github.com

# Git SSH keys swap
alias work_git="ssh-add -D  && ssh-add -K ~/.ssh/id_rsa_work"
alias personal_git="ssh-add -D && ssh-add -K ~/.ssh/id_rsa"
Другие вопросы по тегам